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

Side by Side Diff: src/runtime.cc

Issue 6756029: Clean up runtime functions. (Closed)
Patch Set: Removed the underscore Created 9 years, 8 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
« no previous file with comments | « src/ic.cc ('k') | src/stub-cache.h » ('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 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 break; 217 break;
218 } 218 }
219 default: 219 default:
220 UNREACHABLE(); 220 UNREACHABLE();
221 break; 221 break;
222 } 222 }
223 return copy; 223 return copy;
224 } 224 }
225 225
226 226
227 static MaybeObject* Runtime_CloneLiteralBoilerplate( 227 RUNTIME_FUNCTION(MaybeObject*, Runtime_CloneLiteralBoilerplate) {
228 RUNTIME_CALLING_CONVENTION) {
229 RUNTIME_GET_ISOLATE;
230 CONVERT_CHECKED(JSObject, boilerplate, args[0]); 228 CONVERT_CHECKED(JSObject, boilerplate, args[0]);
231 return DeepCopyBoilerplate(isolate, boilerplate); 229 return DeepCopyBoilerplate(isolate, boilerplate);
232 } 230 }
233 231
234 232
235 static MaybeObject* Runtime_CloneShallowLiteralBoilerplate( 233 RUNTIME_FUNCTION(MaybeObject*, Runtime_CloneShallowLiteralBoilerplate) {
236 RUNTIME_CALLING_CONVENTION) {
237 RUNTIME_GET_ISOLATE;
238 CONVERT_CHECKED(JSObject, boilerplate, args[0]); 234 CONVERT_CHECKED(JSObject, boilerplate, args[0]);
239 return isolate->heap()->CopyJSObject(boilerplate); 235 return isolate->heap()->CopyJSObject(boilerplate);
240 } 236 }
241 237
242 238
243 static Handle<Map> ComputeObjectLiteralMap( 239 static Handle<Map> ComputeObjectLiteralMap(
244 Handle<Context> context, 240 Handle<Context> context,
245 Handle<FixedArray> constant_properties, 241 Handle<FixedArray> constant_properties,
246 bool* is_result_from_cache) { 242 bool* is_result_from_cache) {
247 Isolate* isolate = context->GetIsolate(); 243 Isolate* isolate = context->GetIsolate();
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 kHasNoFunctionLiteral); 464 kHasNoFunctionLiteral);
469 case CompileTimeValue::ARRAY_LITERAL: 465 case CompileTimeValue::ARRAY_LITERAL:
470 return CreateArrayLiteralBoilerplate(isolate, literals, elements); 466 return CreateArrayLiteralBoilerplate(isolate, literals, elements);
471 default: 467 default:
472 UNREACHABLE(); 468 UNREACHABLE();
473 return Handle<Object>::null(); 469 return Handle<Object>::null();
474 } 470 }
475 } 471 }
476 472
477 473
478 static MaybeObject* Runtime_CreateArrayLiteralBoilerplate( 474 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteralBoilerplate) {
479 RUNTIME_CALLING_CONVENTION) {
480 RUNTIME_GET_ISOLATE;
481 // Takes a FixedArray of elements containing the literal elements of 475 // Takes a FixedArray of elements containing the literal elements of
482 // the array literal and produces JSArray with those elements. 476 // the array literal and produces JSArray with those elements.
483 // Additionally takes the literals array of the surrounding function 477 // Additionally takes the literals array of the surrounding function
484 // which contains the context from which to get the Array function 478 // which contains the context from which to get the Array function
485 // to use for creating the array literal. 479 // to use for creating the array literal.
486 HandleScope scope(isolate); 480 HandleScope scope(isolate);
487 ASSERT(args.length() == 3); 481 ASSERT(args.length() == 3);
488 CONVERT_ARG_CHECKED(FixedArray, literals, 0); 482 CONVERT_ARG_CHECKED(FixedArray, literals, 0);
489 CONVERT_SMI_CHECKED(literals_index, args[1]); 483 CONVERT_SMI_CHECKED(literals_index, args[1]);
490 CONVERT_ARG_CHECKED(FixedArray, elements, 2); 484 CONVERT_ARG_CHECKED(FixedArray, elements, 2);
491 485
492 Handle<Object> object = 486 Handle<Object> object =
493 CreateArrayLiteralBoilerplate(isolate, literals, elements); 487 CreateArrayLiteralBoilerplate(isolate, literals, elements);
494 if (object.is_null()) return Failure::Exception(); 488 if (object.is_null()) return Failure::Exception();
495 489
496 // Update the functions literal and return the boilerplate. 490 // Update the functions literal and return the boilerplate.
497 literals->set(literals_index, *object); 491 literals->set(literals_index, *object);
498 return *object; 492 return *object;
499 } 493 }
500 494
501 495
502 static MaybeObject* Runtime_CreateObjectLiteral(RUNTIME_CALLING_CONVENTION) { 496 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateObjectLiteral) {
503 RUNTIME_GET_ISOLATE;
504 HandleScope scope(isolate); 497 HandleScope scope(isolate);
505 ASSERT(args.length() == 4); 498 ASSERT(args.length() == 4);
506 CONVERT_ARG_CHECKED(FixedArray, literals, 0); 499 CONVERT_ARG_CHECKED(FixedArray, literals, 0);
507 CONVERT_SMI_CHECKED(literals_index, args[1]); 500 CONVERT_SMI_CHECKED(literals_index, args[1]);
508 CONVERT_ARG_CHECKED(FixedArray, constant_properties, 2); 501 CONVERT_ARG_CHECKED(FixedArray, constant_properties, 2);
509 CONVERT_SMI_CHECKED(flags, args[3]); 502 CONVERT_SMI_CHECKED(flags, args[3]);
510 bool should_have_fast_elements = (flags & ObjectLiteral::kFastElements) != 0; 503 bool should_have_fast_elements = (flags & ObjectLiteral::kFastElements) != 0;
511 bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0; 504 bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0;
512 505
513 // Check if boilerplate exists. If not, create it first. 506 // Check if boilerplate exists. If not, create it first.
514 Handle<Object> boilerplate(literals->get(literals_index), isolate); 507 Handle<Object> boilerplate(literals->get(literals_index), isolate);
515 if (*boilerplate == isolate->heap()->undefined_value()) { 508 if (*boilerplate == isolate->heap()->undefined_value()) {
516 boilerplate = CreateObjectLiteralBoilerplate(isolate, 509 boilerplate = CreateObjectLiteralBoilerplate(isolate,
517 literals, 510 literals,
518 constant_properties, 511 constant_properties,
519 should_have_fast_elements, 512 should_have_fast_elements,
520 has_function_literal); 513 has_function_literal);
521 if (boilerplate.is_null()) return Failure::Exception(); 514 if (boilerplate.is_null()) return Failure::Exception();
522 // Update the functions literal and return the boilerplate. 515 // Update the functions literal and return the boilerplate.
523 literals->set(literals_index, *boilerplate); 516 literals->set(literals_index, *boilerplate);
524 } 517 }
525 return DeepCopyBoilerplate(isolate, JSObject::cast(*boilerplate)); 518 return DeepCopyBoilerplate(isolate, JSObject::cast(*boilerplate));
526 } 519 }
527 520
528 521
529 static MaybeObject* Runtime_CreateObjectLiteralShallow( 522 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateObjectLiteralShallow) {
530 RUNTIME_CALLING_CONVENTION) {
531 RUNTIME_GET_ISOLATE;
532 HandleScope scope(isolate); 523 HandleScope scope(isolate);
533 ASSERT(args.length() == 4); 524 ASSERT(args.length() == 4);
534 CONVERT_ARG_CHECKED(FixedArray, literals, 0); 525 CONVERT_ARG_CHECKED(FixedArray, literals, 0);
535 CONVERT_SMI_CHECKED(literals_index, args[1]); 526 CONVERT_SMI_CHECKED(literals_index, args[1]);
536 CONVERT_ARG_CHECKED(FixedArray, constant_properties, 2); 527 CONVERT_ARG_CHECKED(FixedArray, constant_properties, 2);
537 CONVERT_SMI_CHECKED(flags, args[3]); 528 CONVERT_SMI_CHECKED(flags, args[3]);
538 bool should_have_fast_elements = (flags & ObjectLiteral::kFastElements) != 0; 529 bool should_have_fast_elements = (flags & ObjectLiteral::kFastElements) != 0;
539 bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0; 530 bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0;
540 531
541 // Check if boilerplate exists. If not, create it first. 532 // Check if boilerplate exists. If not, create it first.
542 Handle<Object> boilerplate(literals->get(literals_index), isolate); 533 Handle<Object> boilerplate(literals->get(literals_index), isolate);
543 if (*boilerplate == isolate->heap()->undefined_value()) { 534 if (*boilerplate == isolate->heap()->undefined_value()) {
544 boilerplate = CreateObjectLiteralBoilerplate(isolate, 535 boilerplate = CreateObjectLiteralBoilerplate(isolate,
545 literals, 536 literals,
546 constant_properties, 537 constant_properties,
547 should_have_fast_elements, 538 should_have_fast_elements,
548 has_function_literal); 539 has_function_literal);
549 if (boilerplate.is_null()) return Failure::Exception(); 540 if (boilerplate.is_null()) return Failure::Exception();
550 // Update the functions literal and return the boilerplate. 541 // Update the functions literal and return the boilerplate.
551 literals->set(literals_index, *boilerplate); 542 literals->set(literals_index, *boilerplate);
552 } 543 }
553 return isolate->heap()->CopyJSObject(JSObject::cast(*boilerplate)); 544 return isolate->heap()->CopyJSObject(JSObject::cast(*boilerplate));
554 } 545 }
555 546
556 547
557 static MaybeObject* Runtime_CreateArrayLiteral(RUNTIME_CALLING_CONVENTION) { 548 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteral) {
558 RUNTIME_GET_ISOLATE;
559 HandleScope scope(isolate); 549 HandleScope scope(isolate);
560 ASSERT(args.length() == 3); 550 ASSERT(args.length() == 3);
561 CONVERT_ARG_CHECKED(FixedArray, literals, 0); 551 CONVERT_ARG_CHECKED(FixedArray, literals, 0);
562 CONVERT_SMI_CHECKED(literals_index, args[1]); 552 CONVERT_SMI_CHECKED(literals_index, args[1]);
563 CONVERT_ARG_CHECKED(FixedArray, elements, 2); 553 CONVERT_ARG_CHECKED(FixedArray, elements, 2);
564 554
565 // Check if boilerplate exists. If not, create it first. 555 // Check if boilerplate exists. If not, create it first.
566 Handle<Object> boilerplate(literals->get(literals_index), isolate); 556 Handle<Object> boilerplate(literals->get(literals_index), isolate);
567 if (*boilerplate == isolate->heap()->undefined_value()) { 557 if (*boilerplate == isolate->heap()->undefined_value()) {
568 boilerplate = CreateArrayLiteralBoilerplate(isolate, literals, elements); 558 boilerplate = CreateArrayLiteralBoilerplate(isolate, literals, elements);
569 if (boilerplate.is_null()) return Failure::Exception(); 559 if (boilerplate.is_null()) return Failure::Exception();
570 // Update the functions literal and return the boilerplate. 560 // Update the functions literal and return the boilerplate.
571 literals->set(literals_index, *boilerplate); 561 literals->set(literals_index, *boilerplate);
572 } 562 }
573 return DeepCopyBoilerplate(isolate, JSObject::cast(*boilerplate)); 563 return DeepCopyBoilerplate(isolate, JSObject::cast(*boilerplate));
574 } 564 }
575 565
576 566
577 static MaybeObject* Runtime_CreateArrayLiteralShallow( 567 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteralShallow) {
578 RUNTIME_CALLING_CONVENTION) {
579 RUNTIME_GET_ISOLATE;
580 HandleScope scope(isolate); 568 HandleScope scope(isolate);
581 ASSERT(args.length() == 3); 569 ASSERT(args.length() == 3);
582 CONVERT_ARG_CHECKED(FixedArray, literals, 0); 570 CONVERT_ARG_CHECKED(FixedArray, literals, 0);
583 CONVERT_SMI_CHECKED(literals_index, args[1]); 571 CONVERT_SMI_CHECKED(literals_index, args[1]);
584 CONVERT_ARG_CHECKED(FixedArray, elements, 2); 572 CONVERT_ARG_CHECKED(FixedArray, elements, 2);
585 573
586 // Check if boilerplate exists. If not, create it first. 574 // Check if boilerplate exists. If not, create it first.
587 Handle<Object> boilerplate(literals->get(literals_index), isolate); 575 Handle<Object> boilerplate(literals->get(literals_index), isolate);
588 if (*boilerplate == isolate->heap()->undefined_value()) { 576 if (*boilerplate == isolate->heap()->undefined_value()) {
589 boilerplate = CreateArrayLiteralBoilerplate(isolate, literals, elements); 577 boilerplate = CreateArrayLiteralBoilerplate(isolate, literals, elements);
590 if (boilerplate.is_null()) return Failure::Exception(); 578 if (boilerplate.is_null()) return Failure::Exception();
591 // Update the functions literal and return the boilerplate. 579 // Update the functions literal and return the boilerplate.
592 literals->set(literals_index, *boilerplate); 580 literals->set(literals_index, *boilerplate);
593 } 581 }
594 if (JSObject::cast(*boilerplate)->elements()->map() == 582 if (JSObject::cast(*boilerplate)->elements()->map() ==
595 isolate->heap()->fixed_cow_array_map()) { 583 isolate->heap()->fixed_cow_array_map()) {
596 isolate->counters()->cow_arrays_created_runtime()->Increment(); 584 isolate->counters()->cow_arrays_created_runtime()->Increment();
597 } 585 }
598 return isolate->heap()->CopyJSObject(JSObject::cast(*boilerplate)); 586 return isolate->heap()->CopyJSObject(JSObject::cast(*boilerplate));
599 } 587 }
600 588
601 589
602 static MaybeObject* Runtime_CreateCatchExtensionObject( 590 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateCatchExtensionObject) {
603 RUNTIME_CALLING_CONVENTION) {
604 RUNTIME_GET_ISOLATE;
605 ASSERT(args.length() == 2); 591 ASSERT(args.length() == 2);
606 CONVERT_CHECKED(String, key, args[0]); 592 CONVERT_CHECKED(String, key, args[0]);
607 Object* value = args[1]; 593 Object* value = args[1];
608 // Create a catch context extension object. 594 // Create a catch context extension object.
609 JSFunction* constructor = 595 JSFunction* constructor =
610 isolate->context()->global_context()-> 596 isolate->context()->global_context()->
611 context_extension_function(); 597 context_extension_function();
612 Object* object; 598 Object* object;
613 { MaybeObject* maybe_object = isolate->heap()->AllocateJSObject(constructor); 599 { MaybeObject* maybe_object = isolate->heap()->AllocateJSObject(constructor);
614 if (!maybe_object->ToObject(&object)) return maybe_object; 600 if (!maybe_object->ToObject(&object)) return maybe_object;
615 } 601 }
616 // Assign the exception value to the catch variable and make sure 602 // Assign the exception value to the catch variable and make sure
617 // that the catch variable is DontDelete. 603 // that the catch variable is DontDelete.
618 { MaybeObject* maybe_value = 604 { MaybeObject* maybe_value =
619 // Passing non-strict per ECMA-262 5th Ed. 12.14. Catch, bullet #4. 605 // Passing non-strict per ECMA-262 5th Ed. 12.14. Catch, bullet #4.
620 JSObject::cast(object)->SetProperty( 606 JSObject::cast(object)->SetProperty(
621 key, value, DONT_DELETE, kNonStrictMode); 607 key, value, DONT_DELETE, kNonStrictMode);
622 if (!maybe_value->ToObject(&value)) return maybe_value; 608 if (!maybe_value->ToObject(&value)) return maybe_value;
623 } 609 }
624 return object; 610 return object;
625 } 611 }
626 612
627 613
628 static MaybeObject* Runtime_ClassOf(RUNTIME_CALLING_CONVENTION) { 614 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClassOf) {
629 RUNTIME_GET_ISOLATE;
630 NoHandleAllocation ha; 615 NoHandleAllocation ha;
631 ASSERT(args.length() == 1); 616 ASSERT(args.length() == 1);
632 Object* obj = args[0]; 617 Object* obj = args[0];
633 if (!obj->IsJSObject()) return isolate->heap()->null_value(); 618 if (!obj->IsJSObject()) return isolate->heap()->null_value();
634 return JSObject::cast(obj)->class_name(); 619 return JSObject::cast(obj)->class_name();
635 } 620 }
636 621
637 622
638 static MaybeObject* Runtime_IsInPrototypeChain(RUNTIME_CALLING_CONVENTION) { 623 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsInPrototypeChain) {
639 RUNTIME_GET_ISOLATE;
640 NoHandleAllocation ha; 624 NoHandleAllocation ha;
641 ASSERT(args.length() == 2); 625 ASSERT(args.length() == 2);
642 // See ECMA-262, section 15.3.5.3, page 88 (steps 5 - 8). 626 // See ECMA-262, section 15.3.5.3, page 88 (steps 5 - 8).
643 Object* O = args[0]; 627 Object* O = args[0];
644 Object* V = args[1]; 628 Object* V = args[1];
645 while (true) { 629 while (true) {
646 Object* prototype = V->GetPrototype(); 630 Object* prototype = V->GetPrototype();
647 if (prototype->IsNull()) return isolate->heap()->false_value(); 631 if (prototype->IsNull()) return isolate->heap()->false_value();
648 if (O == prototype) return isolate->heap()->true_value(); 632 if (O == prototype) return isolate->heap()->true_value();
649 V = prototype; 633 V = prototype;
650 } 634 }
651 } 635 }
652 636
653 637
654 // Inserts an object as the hidden prototype of another object. 638 // Inserts an object as the hidden prototype of another object.
655 static MaybeObject* Runtime_SetHiddenPrototype(RUNTIME_CALLING_CONVENTION) { 639 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetHiddenPrototype) {
656 RUNTIME_GET_ISOLATE;
657 NoHandleAllocation ha; 640 NoHandleAllocation ha;
658 ASSERT(args.length() == 2); 641 ASSERT(args.length() == 2);
659 CONVERT_CHECKED(JSObject, jsobject, args[0]); 642 CONVERT_CHECKED(JSObject, jsobject, args[0]);
660 CONVERT_CHECKED(JSObject, proto, args[1]); 643 CONVERT_CHECKED(JSObject, proto, args[1]);
661 644
662 // Sanity checks. The old prototype (that we are replacing) could 645 // Sanity checks. The old prototype (that we are replacing) could
663 // theoretically be null, but if it is not null then check that we 646 // theoretically be null, but if it is not null then check that we
664 // didn't already install a hidden prototype here. 647 // didn't already install a hidden prototype here.
665 RUNTIME_ASSERT(!jsobject->GetPrototype()->IsHeapObject() || 648 RUNTIME_ASSERT(!jsobject->GetPrototype()->IsHeapObject() ||
666 !HeapObject::cast(jsobject->GetPrototype())->map()->is_hidden_prototype()); 649 !HeapObject::cast(jsobject->GetPrototype())->map()->is_hidden_prototype());
(...skipping 21 matching lines...) Expand all
688 new_proto_map->set_is_hidden_prototype(); 671 new_proto_map->set_is_hidden_prototype();
689 672
690 // Set the object's prototype to proto. 673 // Set the object's prototype to proto.
691 new_map->set_prototype(proto); 674 new_map->set_prototype(proto);
692 jsobject->set_map(new_map); 675 jsobject->set_map(new_map);
693 676
694 return isolate->heap()->undefined_value(); 677 return isolate->heap()->undefined_value();
695 } 678 }
696 679
697 680
698 static MaybeObject* Runtime_IsConstructCall(RUNTIME_CALLING_CONVENTION) { 681 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsConstructCall) {
699 RUNTIME_GET_ISOLATE;
700 NoHandleAllocation ha; 682 NoHandleAllocation ha;
701 ASSERT(args.length() == 0); 683 ASSERT(args.length() == 0);
702 JavaScriptFrameIterator it; 684 JavaScriptFrameIterator it;
703 return isolate->heap()->ToBoolean(it.frame()->IsConstructor()); 685 return isolate->heap()->ToBoolean(it.frame()->IsConstructor());
704 } 686 }
705 687
706 688
707 // Recursively traverses hidden prototypes if property is not found 689 // Recursively traverses hidden prototypes if property is not found
708 static void GetOwnPropertyImplementation(JSObject* obj, 690 static void GetOwnPropertyImplementation(JSObject* obj,
709 String* name, 691 String* name,
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
817 DESCRIPTOR_SIZE 799 DESCRIPTOR_SIZE
818 }; 800 };
819 801
820 // Returns an array with the property description: 802 // Returns an array with the property description:
821 // if args[1] is not a property on args[0] 803 // if args[1] is not a property on args[0]
822 // returns undefined 804 // returns undefined
823 // if args[1] is a data property on args[0] 805 // if args[1] is a data property on args[0]
824 // [false, value, Writeable, Enumerable, Configurable] 806 // [false, value, Writeable, Enumerable, Configurable]
825 // if args[1] is an accessor on args[0] 807 // if args[1] is an accessor on args[0]
826 // [true, GetFunction, SetFunction, Enumerable, Configurable] 808 // [true, GetFunction, SetFunction, Enumerable, Configurable]
827 static MaybeObject* Runtime_GetOwnProperty(RUNTIME_CALLING_CONVENTION) { 809 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOwnProperty) {
828 RUNTIME_GET_ISOLATE;
829 ASSERT(args.length() == 2); 810 ASSERT(args.length() == 2);
830 Heap* heap = isolate->heap(); 811 Heap* heap = isolate->heap();
831 HandleScope scope(isolate); 812 HandleScope scope(isolate);
832 Handle<FixedArray> elms = isolate->factory()->NewFixedArray(DESCRIPTOR_SIZE); 813 Handle<FixedArray> elms = isolate->factory()->NewFixedArray(DESCRIPTOR_SIZE);
833 Handle<JSArray> desc = isolate->factory()->NewJSArrayWithElements(elms); 814 Handle<JSArray> desc = isolate->factory()->NewJSArrayWithElements(elms);
834 LookupResult result; 815 LookupResult result;
835 CONVERT_ARG_CHECKED(JSObject, obj, 0); 816 CONVERT_ARG_CHECKED(JSObject, obj, 0);
836 CONVERT_ARG_CHECKED(String, name, 1); 817 CONVERT_ARG_CHECKED(String, name, 1);
837 818
838 // This could be an element. 819 // This could be an element.
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
955 { MaybeObject* maybe_value = obj->GetProperty(*obj, &result, *name, &attrs); 936 { MaybeObject* maybe_value = obj->GetProperty(*obj, &result, *name, &attrs);
956 if (!maybe_value->ToObject(&value)) return maybe_value; 937 if (!maybe_value->ToObject(&value)) return maybe_value;
957 } 938 }
958 elms->set(VALUE_INDEX, value); 939 elms->set(VALUE_INDEX, value);
959 } 940 }
960 941
961 return *desc; 942 return *desc;
962 } 943 }
963 944
964 945
965 static MaybeObject* Runtime_PreventExtensions(RUNTIME_CALLING_CONVENTION) { 946 RUNTIME_FUNCTION(MaybeObject*, Runtime_PreventExtensions) {
966 RUNTIME_GET_ISOLATE;
967 ASSERT(args.length() == 1); 947 ASSERT(args.length() == 1);
968 CONVERT_CHECKED(JSObject, obj, args[0]); 948 CONVERT_CHECKED(JSObject, obj, args[0]);
969 return obj->PreventExtensions(); 949 return obj->PreventExtensions();
970 } 950 }
971 951
972 952
973 static MaybeObject* Runtime_IsExtensible(RUNTIME_CALLING_CONVENTION) { 953 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsExtensible) {
974 RUNTIME_GET_ISOLATE;
975 ASSERT(args.length() == 1); 954 ASSERT(args.length() == 1);
976 CONVERT_CHECKED(JSObject, obj, args[0]); 955 CONVERT_CHECKED(JSObject, obj, args[0]);
977 if (obj->IsJSGlobalProxy()) { 956 if (obj->IsJSGlobalProxy()) {
978 Object* proto = obj->GetPrototype(); 957 Object* proto = obj->GetPrototype();
979 if (proto->IsNull()) return isolate->heap()->false_value(); 958 if (proto->IsNull()) return isolate->heap()->false_value();
980 ASSERT(proto->IsJSGlobalObject()); 959 ASSERT(proto->IsJSGlobalObject());
981 obj = JSObject::cast(proto); 960 obj = JSObject::cast(proto);
982 } 961 }
983 return obj->map()->is_extensible() ? isolate->heap()->true_value() 962 return obj->map()->is_extensible() ? isolate->heap()->true_value()
984 : isolate->heap()->false_value(); 963 : isolate->heap()->false_value();
985 } 964 }
986 965
987 966
988 static MaybeObject* Runtime_RegExpCompile(RUNTIME_CALLING_CONVENTION) { 967 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpCompile) {
989 RUNTIME_GET_ISOLATE;
990 HandleScope scope(isolate); 968 HandleScope scope(isolate);
991 ASSERT(args.length() == 3); 969 ASSERT(args.length() == 3);
992 CONVERT_ARG_CHECKED(JSRegExp, re, 0); 970 CONVERT_ARG_CHECKED(JSRegExp, re, 0);
993 CONVERT_ARG_CHECKED(String, pattern, 1); 971 CONVERT_ARG_CHECKED(String, pattern, 1);
994 CONVERT_ARG_CHECKED(String, flags, 2); 972 CONVERT_ARG_CHECKED(String, flags, 2);
995 Handle<Object> result = RegExpImpl::Compile(re, pattern, flags); 973 Handle<Object> result = RegExpImpl::Compile(re, pattern, flags);
996 if (result.is_null()) return Failure::Exception(); 974 if (result.is_null()) return Failure::Exception();
997 return *result; 975 return *result;
998 } 976 }
999 977
1000 978
1001 static MaybeObject* Runtime_CreateApiFunction(RUNTIME_CALLING_CONVENTION) { 979 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateApiFunction) {
1002 RUNTIME_GET_ISOLATE;
1003 HandleScope scope(isolate); 980 HandleScope scope(isolate);
1004 ASSERT(args.length() == 1); 981 ASSERT(args.length() == 1);
1005 CONVERT_ARG_CHECKED(FunctionTemplateInfo, data, 0); 982 CONVERT_ARG_CHECKED(FunctionTemplateInfo, data, 0);
1006 return *isolate->factory()->CreateApiFunction(data); 983 return *isolate->factory()->CreateApiFunction(data);
1007 } 984 }
1008 985
1009 986
1010 static MaybeObject* Runtime_IsTemplate(RUNTIME_CALLING_CONVENTION) { 987 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsTemplate) {
1011 RUNTIME_GET_ISOLATE;
1012 ASSERT(args.length() == 1); 988 ASSERT(args.length() == 1);
1013 Object* arg = args[0]; 989 Object* arg = args[0];
1014 bool result = arg->IsObjectTemplateInfo() || arg->IsFunctionTemplateInfo(); 990 bool result = arg->IsObjectTemplateInfo() || arg->IsFunctionTemplateInfo();
1015 return isolate->heap()->ToBoolean(result); 991 return isolate->heap()->ToBoolean(result);
1016 } 992 }
1017 993
1018 994
1019 static MaybeObject* Runtime_GetTemplateField(RUNTIME_CALLING_CONVENTION) { 995 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetTemplateField) {
1020 RUNTIME_GET_ISOLATE;
1021 ASSERT(args.length() == 2); 996 ASSERT(args.length() == 2);
1022 CONVERT_CHECKED(HeapObject, templ, args[0]); 997 CONVERT_CHECKED(HeapObject, templ, args[0]);
1023 CONVERT_CHECKED(Smi, field, args[1]); 998 CONVERT_CHECKED(Smi, field, args[1]);
1024 int index = field->value(); 999 int index = field->value();
1025 int offset = index * kPointerSize + HeapObject::kHeaderSize; 1000 int offset = index * kPointerSize + HeapObject::kHeaderSize;
1026 InstanceType type = templ->map()->instance_type(); 1001 InstanceType type = templ->map()->instance_type();
1027 RUNTIME_ASSERT(type == FUNCTION_TEMPLATE_INFO_TYPE || 1002 RUNTIME_ASSERT(type == FUNCTION_TEMPLATE_INFO_TYPE ||
1028 type == OBJECT_TEMPLATE_INFO_TYPE); 1003 type == OBJECT_TEMPLATE_INFO_TYPE);
1029 RUNTIME_ASSERT(offset > 0); 1004 RUNTIME_ASSERT(offset > 0);
1030 if (type == FUNCTION_TEMPLATE_INFO_TYPE) { 1005 if (type == FUNCTION_TEMPLATE_INFO_TYPE) {
1031 RUNTIME_ASSERT(offset < FunctionTemplateInfo::kSize); 1006 RUNTIME_ASSERT(offset < FunctionTemplateInfo::kSize);
1032 } else { 1007 } else {
1033 RUNTIME_ASSERT(offset < ObjectTemplateInfo::kSize); 1008 RUNTIME_ASSERT(offset < ObjectTemplateInfo::kSize);
1034 } 1009 }
1035 return *HeapObject::RawField(templ, offset); 1010 return *HeapObject::RawField(templ, offset);
1036 } 1011 }
1037 1012
1038 1013
1039 static MaybeObject* Runtime_DisableAccessChecks(RUNTIME_CALLING_CONVENTION) { 1014 RUNTIME_FUNCTION(MaybeObject*, Runtime_DisableAccessChecks) {
1040 RUNTIME_GET_ISOLATE;
1041 ASSERT(args.length() == 1); 1015 ASSERT(args.length() == 1);
1042 CONVERT_CHECKED(HeapObject, object, args[0]); 1016 CONVERT_CHECKED(HeapObject, object, args[0]);
1043 Map* old_map = object->map(); 1017 Map* old_map = object->map();
1044 bool needs_access_checks = old_map->is_access_check_needed(); 1018 bool needs_access_checks = old_map->is_access_check_needed();
1045 if (needs_access_checks) { 1019 if (needs_access_checks) {
1046 // Copy map so it won't interfere constructor's initial map. 1020 // Copy map so it won't interfere constructor's initial map.
1047 Object* new_map; 1021 Object* new_map;
1048 { MaybeObject* maybe_new_map = old_map->CopyDropTransitions(); 1022 { MaybeObject* maybe_new_map = old_map->CopyDropTransitions();
1049 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map; 1023 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map;
1050 } 1024 }
1051 1025
1052 Map::cast(new_map)->set_is_access_check_needed(false); 1026 Map::cast(new_map)->set_is_access_check_needed(false);
1053 object->set_map(Map::cast(new_map)); 1027 object->set_map(Map::cast(new_map));
1054 } 1028 }
1055 return needs_access_checks ? isolate->heap()->true_value() 1029 return needs_access_checks ? isolate->heap()->true_value()
1056 : isolate->heap()->false_value(); 1030 : isolate->heap()->false_value();
1057 } 1031 }
1058 1032
1059 1033
1060 static MaybeObject* Runtime_EnableAccessChecks(RUNTIME_CALLING_CONVENTION) { 1034 RUNTIME_FUNCTION(MaybeObject*, Runtime_EnableAccessChecks) {
1061 RUNTIME_GET_ISOLATE;
1062 ASSERT(args.length() == 1); 1035 ASSERT(args.length() == 1);
1063 CONVERT_CHECKED(HeapObject, object, args[0]); 1036 CONVERT_CHECKED(HeapObject, object, args[0]);
1064 Map* old_map = object->map(); 1037 Map* old_map = object->map();
1065 if (!old_map->is_access_check_needed()) { 1038 if (!old_map->is_access_check_needed()) {
1066 // Copy map so it won't interfere constructor's initial map. 1039 // Copy map so it won't interfere constructor's initial map.
1067 Object* new_map; 1040 Object* new_map;
1068 { MaybeObject* maybe_new_map = old_map->CopyDropTransitions(); 1041 { MaybeObject* maybe_new_map = old_map->CopyDropTransitions();
1069 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map; 1042 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map;
1070 } 1043 }
1071 1044
(...skipping 10 matching lines...) Expand all
1082 HandleScope scope(isolate); 1055 HandleScope scope(isolate);
1083 Handle<Object> type_handle = 1056 Handle<Object> type_handle =
1084 isolate->factory()->NewStringFromAscii(CStrVector(type)); 1057 isolate->factory()->NewStringFromAscii(CStrVector(type));
1085 Handle<Object> args[2] = { type_handle, name }; 1058 Handle<Object> args[2] = { type_handle, name };
1086 Handle<Object> error = 1059 Handle<Object> error =
1087 isolate->factory()->NewTypeError("redeclaration", HandleVector(args, 2)); 1060 isolate->factory()->NewTypeError("redeclaration", HandleVector(args, 2));
1088 return isolate->Throw(*error); 1061 return isolate->Throw(*error);
1089 } 1062 }
1090 1063
1091 1064
1092 static MaybeObject* Runtime_DeclareGlobals(RUNTIME_CALLING_CONVENTION) { 1065 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) {
1093 RUNTIME_GET_ISOLATE;
1094 ASSERT(args.length() == 4); 1066 ASSERT(args.length() == 4);
1095 HandleScope scope(isolate); 1067 HandleScope scope(isolate);
1096 Handle<GlobalObject> global = Handle<GlobalObject>( 1068 Handle<GlobalObject> global = Handle<GlobalObject>(
1097 isolate->context()->global()); 1069 isolate->context()->global());
1098 1070
1099 Handle<Context> context = args.at<Context>(0); 1071 Handle<Context> context = args.at<Context>(0);
1100 CONVERT_ARG_CHECKED(FixedArray, pairs, 1); 1072 CONVERT_ARG_CHECKED(FixedArray, pairs, 1);
1101 bool is_eval = Smi::cast(args[2])->value() == 1; 1073 bool is_eval = Smi::cast(args[2])->value() == 1;
1102 StrictModeFlag strict_mode = 1074 StrictModeFlag strict_mode =
1103 static_cast<StrictModeFlag>(Smi::cast(args[3])->value()); 1075 static_cast<StrictModeFlag>(Smi::cast(args[3])->value());
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1226 attributes, 1198 attributes,
1227 strict_mode)); 1199 strict_mode));
1228 } 1200 }
1229 } 1201 }
1230 1202
1231 ASSERT(!isolate->has_pending_exception()); 1203 ASSERT(!isolate->has_pending_exception());
1232 return isolate->heap()->undefined_value(); 1204 return isolate->heap()->undefined_value();
1233 } 1205 }
1234 1206
1235 1207
1236 static MaybeObject* Runtime_DeclareContextSlot(RUNTIME_CALLING_CONVENTION) { 1208 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareContextSlot) {
1237 RUNTIME_GET_ISOLATE;
1238 HandleScope scope(isolate); 1209 HandleScope scope(isolate);
1239 ASSERT(args.length() == 4); 1210 ASSERT(args.length() == 4);
1240 1211
1241 CONVERT_ARG_CHECKED(Context, context, 0); 1212 CONVERT_ARG_CHECKED(Context, context, 0);
1242 Handle<String> name(String::cast(args[1])); 1213 Handle<String> name(String::cast(args[1]));
1243 PropertyAttributes mode = 1214 PropertyAttributes mode =
1244 static_cast<PropertyAttributes>(Smi::cast(args[2])->value()); 1215 static_cast<PropertyAttributes>(Smi::cast(args[2])->value());
1245 RUNTIME_ASSERT(mode == READ_ONLY || mode == NONE); 1216 RUNTIME_ASSERT(mode == READ_ONLY || mode == NONE);
1246 Handle<Object> initial_value(args[3], isolate); 1217 Handle<Object> initial_value(args[3], isolate);
1247 1218
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
1333 } 1304 }
1334 RETURN_IF_EMPTY_HANDLE(isolate, 1305 RETURN_IF_EMPTY_HANDLE(isolate,
1335 SetProperty(context_ext, name, value, mode, 1306 SetProperty(context_ext, name, value, mode,
1336 kNonStrictMode)); 1307 kNonStrictMode));
1337 } 1308 }
1338 1309
1339 return isolate->heap()->undefined_value(); 1310 return isolate->heap()->undefined_value();
1340 } 1311 }
1341 1312
1342 1313
1343 static MaybeObject* Runtime_InitializeVarGlobal(RUNTIME_CALLING_CONVENTION) { 1314 RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeVarGlobal) {
1344 RUNTIME_GET_ISOLATE;
1345 NoHandleAllocation nha; 1315 NoHandleAllocation nha;
1346 // args[0] == name 1316 // args[0] == name
1347 // args[1] == strict_mode 1317 // args[1] == strict_mode
1348 // args[2] == value (optional) 1318 // args[2] == value (optional)
1349 1319
1350 // Determine if we need to assign to the variable if it already 1320 // Determine if we need to assign to the variable if it already
1351 // exists (based on the number of arguments). 1321 // exists (based on the number of arguments).
1352 RUNTIME_ASSERT(args.length() == 2 || args.length() == 3); 1322 RUNTIME_ASSERT(args.length() == 2 || args.length() == 3);
1353 bool assign = args.length() == 3; 1323 bool assign = args.length() == 3;
1354 1324
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1429 } 1399 }
1430 1400
1431 global = isolate->context()->global(); 1401 global = isolate->context()->global();
1432 if (assign) { 1402 if (assign) {
1433 return global->SetProperty(*name, args[2], attributes, strict_mode); 1403 return global->SetProperty(*name, args[2], attributes, strict_mode);
1434 } 1404 }
1435 return isolate->heap()->undefined_value(); 1405 return isolate->heap()->undefined_value();
1436 } 1406 }
1437 1407
1438 1408
1439 static MaybeObject* Runtime_InitializeConstGlobal(RUNTIME_CALLING_CONVENTION) { 1409 RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeConstGlobal) {
1440 RUNTIME_GET_ISOLATE;
1441 // All constants are declared with an initial value. The name 1410 // All constants are declared with an initial value. The name
1442 // of the constant is the first argument and the initial value 1411 // of the constant is the first argument and the initial value
1443 // is the second. 1412 // is the second.
1444 RUNTIME_ASSERT(args.length() == 2); 1413 RUNTIME_ASSERT(args.length() == 2);
1445 CONVERT_ARG_CHECKED(String, name, 0); 1414 CONVERT_ARG_CHECKED(String, name, 0);
1446 Handle<Object> value = args.at<Object>(1); 1415 Handle<Object> value = args.at<Object>(1);
1447 1416
1448 // Get the current global object from top. 1417 // Get the current global object from top.
1449 GlobalObject* global = isolate->context()->global(); 1418 GlobalObject* global = isolate->context()->global();
1450 1419
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1520 // Ignore re-initialization of constants that have already been 1489 // Ignore re-initialization of constants that have already been
1521 // assigned a function value. 1490 // assigned a function value.
1522 ASSERT(lookup.IsReadOnly() && type == CONSTANT_FUNCTION); 1491 ASSERT(lookup.IsReadOnly() && type == CONSTANT_FUNCTION);
1523 } 1492 }
1524 1493
1525 // Use the set value as the result of the operation. 1494 // Use the set value as the result of the operation.
1526 return *value; 1495 return *value;
1527 } 1496 }
1528 1497
1529 1498
1530 static MaybeObject* Runtime_InitializeConstContextSlot( 1499 RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeConstContextSlot) {
1531 RUNTIME_CALLING_CONVENTION) {
1532 RUNTIME_GET_ISOLATE;
1533 HandleScope scope(isolate); 1500 HandleScope scope(isolate);
1534 ASSERT(args.length() == 3); 1501 ASSERT(args.length() == 3);
1535 1502
1536 Handle<Object> value(args[0], isolate); 1503 Handle<Object> value(args[0], isolate);
1537 ASSERT(!value->IsTheHole()); 1504 ASSERT(!value->IsTheHole());
1538 CONVERT_ARG_CHECKED(Context, context, 1); 1505 CONVERT_ARG_CHECKED(Context, context, 1);
1539 Handle<String> name(String::cast(args[2])); 1506 Handle<String> name(String::cast(args[2]));
1540 1507
1541 // Initializations are always done in the function context. 1508 // Initializations are always done in the function context.
1542 context = Handle<Context>(context->fcontext()); 1509 context = Handle<Context>(context->fcontext());
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1629 RETURN_IF_EMPTY_HANDLE( 1596 RETURN_IF_EMPTY_HANDLE(
1630 isolate, 1597 isolate,
1631 SetProperty(context_ext, name, value, attributes, kNonStrictMode)); 1598 SetProperty(context_ext, name, value, attributes, kNonStrictMode));
1632 } 1599 }
1633 } 1600 }
1634 1601
1635 return *value; 1602 return *value;
1636 } 1603 }
1637 1604
1638 1605
1639 static MaybeObject* Runtime_OptimizeObjectForAddingMultipleProperties( 1606 RUNTIME_FUNCTION(MaybeObject*,
1640 RUNTIME_CALLING_CONVENTION) { 1607 Runtime_OptimizeObjectForAddingMultipleProperties) {
1641 RUNTIME_GET_ISOLATE;
1642 HandleScope scope(isolate); 1608 HandleScope scope(isolate);
1643 ASSERT(args.length() == 2); 1609 ASSERT(args.length() == 2);
1644 CONVERT_ARG_CHECKED(JSObject, object, 0); 1610 CONVERT_ARG_CHECKED(JSObject, object, 0);
1645 CONVERT_SMI_CHECKED(properties, args[1]); 1611 CONVERT_SMI_CHECKED(properties, args[1]);
1646 if (object->HasFastProperties()) { 1612 if (object->HasFastProperties()) {
1647 NormalizeProperties(object, KEEP_INOBJECT_PROPERTIES, properties); 1613 NormalizeProperties(object, KEEP_INOBJECT_PROPERTIES, properties);
1648 } 1614 }
1649 return *object; 1615 return *object;
1650 } 1616 }
1651 1617
1652 1618
1653 static MaybeObject* Runtime_RegExpExec(RUNTIME_CALLING_CONVENTION) { 1619 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpExec) {
1654 RUNTIME_GET_ISOLATE;
1655 HandleScope scope(isolate); 1620 HandleScope scope(isolate);
1656 ASSERT(args.length() == 4); 1621 ASSERT(args.length() == 4);
1657 CONVERT_ARG_CHECKED(JSRegExp, regexp, 0); 1622 CONVERT_ARG_CHECKED(JSRegExp, regexp, 0);
1658 CONVERT_ARG_CHECKED(String, subject, 1); 1623 CONVERT_ARG_CHECKED(String, subject, 1);
1659 // Due to the way the JS calls are constructed this must be less than the 1624 // Due to the way the JS calls are constructed this must be less than the
1660 // length of a string, i.e. it is always a Smi. We check anyway for security. 1625 // length of a string, i.e. it is always a Smi. We check anyway for security.
1661 CONVERT_SMI_CHECKED(index, args[2]); 1626 CONVERT_SMI_CHECKED(index, args[2]);
1662 CONVERT_ARG_CHECKED(JSArray, last_match_info, 3); 1627 CONVERT_ARG_CHECKED(JSArray, last_match_info, 3);
1663 RUNTIME_ASSERT(last_match_info->HasFastElements()); 1628 RUNTIME_ASSERT(last_match_info->HasFastElements());
1664 RUNTIME_ASSERT(index >= 0); 1629 RUNTIME_ASSERT(index >= 0);
1665 RUNTIME_ASSERT(index <= subject->length()); 1630 RUNTIME_ASSERT(index <= subject->length());
1666 isolate->counters()->regexp_entry_runtime()->Increment(); 1631 isolate->counters()->regexp_entry_runtime()->Increment();
1667 Handle<Object> result = RegExpImpl::Exec(regexp, 1632 Handle<Object> result = RegExpImpl::Exec(regexp,
1668 subject, 1633 subject,
1669 index, 1634 index,
1670 last_match_info); 1635 last_match_info);
1671 if (result.is_null()) return Failure::Exception(); 1636 if (result.is_null()) return Failure::Exception();
1672 return *result; 1637 return *result;
1673 } 1638 }
1674 1639
1675 1640
1676 static MaybeObject* Runtime_RegExpConstructResult(RUNTIME_CALLING_CONVENTION) { 1641 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpConstructResult) {
1677 RUNTIME_GET_ISOLATE;
1678 ASSERT(args.length() == 3); 1642 ASSERT(args.length() == 3);
1679 CONVERT_SMI_CHECKED(elements_count, args[0]); 1643 CONVERT_SMI_CHECKED(elements_count, args[0]);
1680 if (elements_count > JSArray::kMaxFastElementsLength) { 1644 if (elements_count > JSArray::kMaxFastElementsLength) {
1681 return isolate->ThrowIllegalOperation(); 1645 return isolate->ThrowIllegalOperation();
1682 } 1646 }
1683 Object* new_object; 1647 Object* new_object;
1684 { MaybeObject* maybe_new_object = 1648 { MaybeObject* maybe_new_object =
1685 isolate->heap()->AllocateFixedArrayWithHoles(elements_count); 1649 isolate->heap()->AllocateFixedArrayWithHoles(elements_count);
1686 if (!maybe_new_object->ToObject(&new_object)) return maybe_new_object; 1650 if (!maybe_new_object->ToObject(&new_object)) return maybe_new_object;
1687 } 1651 }
(...skipping 12 matching lines...) Expand all
1700 array->set_properties(isolate->heap()->empty_fixed_array()); 1664 array->set_properties(isolate->heap()->empty_fixed_array());
1701 array->set_elements(elements); 1665 array->set_elements(elements);
1702 array->set_length(Smi::FromInt(elements_count)); 1666 array->set_length(Smi::FromInt(elements_count));
1703 // Write in-object properties after the length of the array. 1667 // Write in-object properties after the length of the array.
1704 array->InObjectPropertyAtPut(JSRegExpResult::kIndexIndex, args[1]); 1668 array->InObjectPropertyAtPut(JSRegExpResult::kIndexIndex, args[1]);
1705 array->InObjectPropertyAtPut(JSRegExpResult::kInputIndex, args[2]); 1669 array->InObjectPropertyAtPut(JSRegExpResult::kInputIndex, args[2]);
1706 return array; 1670 return array;
1707 } 1671 }
1708 1672
1709 1673
1710 static MaybeObject* Runtime_RegExpInitializeObject(RUNTIME_CALLING_CONVENTION) { 1674 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpInitializeObject) {
1711 RUNTIME_GET_ISOLATE;
1712 AssertNoAllocation no_alloc; 1675 AssertNoAllocation no_alloc;
1713 ASSERT(args.length() == 5); 1676 ASSERT(args.length() == 5);
1714 CONVERT_CHECKED(JSRegExp, regexp, args[0]); 1677 CONVERT_CHECKED(JSRegExp, regexp, args[0]);
1715 CONVERT_CHECKED(String, source, args[1]); 1678 CONVERT_CHECKED(String, source, args[1]);
1716 1679
1717 Object* global = args[2]; 1680 Object* global = args[2];
1718 if (!global->IsTrue()) global = isolate->heap()->false_value(); 1681 if (!global->IsTrue()) global = isolate->heap()->false_value();
1719 1682
1720 Object* ignoreCase = args[3]; 1683 Object* ignoreCase = args[3];
1721 if (!ignoreCase->IsTrue()) ignoreCase = isolate->heap()->false_value(); 1684 if (!ignoreCase->IsTrue()) ignoreCase = isolate->heap()->false_value();
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1767 result = 1730 result =
1768 regexp->SetLocalPropertyIgnoreAttributes(heap->last_index_symbol(), 1731 regexp->SetLocalPropertyIgnoreAttributes(heap->last_index_symbol(),
1769 Smi::FromInt(0), 1732 Smi::FromInt(0),
1770 writable); 1733 writable);
1771 ASSERT(!result->IsFailure()); 1734 ASSERT(!result->IsFailure());
1772 USE(result); 1735 USE(result);
1773 return regexp; 1736 return regexp;
1774 } 1737 }
1775 1738
1776 1739
1777 static MaybeObject* Runtime_FinishArrayPrototypeSetup( 1740 RUNTIME_FUNCTION(MaybeObject*, Runtime_FinishArrayPrototypeSetup) {
1778 RUNTIME_CALLING_CONVENTION) {
1779 RUNTIME_GET_ISOLATE;
1780 HandleScope scope(isolate); 1741 HandleScope scope(isolate);
1781 ASSERT(args.length() == 1); 1742 ASSERT(args.length() == 1);
1782 CONVERT_ARG_CHECKED(JSArray, prototype, 0); 1743 CONVERT_ARG_CHECKED(JSArray, prototype, 0);
1783 // This is necessary to enable fast checks for absence of elements 1744 // This is necessary to enable fast checks for absence of elements
1784 // on Array.prototype and below. 1745 // on Array.prototype and below.
1785 prototype->set_elements(isolate->heap()->empty_fixed_array()); 1746 prototype->set_elements(isolate->heap()->empty_fixed_array());
1786 return Smi::FromInt(0); 1747 return Smi::FromInt(0);
1787 } 1748 }
1788 1749
1789 1750
1790 static Handle<JSFunction> InstallBuiltin(Isolate* isolate, 1751 static Handle<JSFunction> InstallBuiltin(Isolate* isolate,
1791 Handle<JSObject> holder, 1752 Handle<JSObject> holder,
1792 const char* name, 1753 const char* name,
1793 Builtins::Name builtin_name) { 1754 Builtins::Name builtin_name) {
1794 Handle<String> key = isolate->factory()->LookupAsciiSymbol(name); 1755 Handle<String> key = isolate->factory()->LookupAsciiSymbol(name);
1795 Handle<Code> code(isolate->builtins()->builtin(builtin_name)); 1756 Handle<Code> code(isolate->builtins()->builtin(builtin_name));
1796 Handle<JSFunction> optimized = 1757 Handle<JSFunction> optimized =
1797 isolate->factory()->NewFunction(key, 1758 isolate->factory()->NewFunction(key,
1798 JS_OBJECT_TYPE, 1759 JS_OBJECT_TYPE,
1799 JSObject::kHeaderSize, 1760 JSObject::kHeaderSize,
1800 code, 1761 code,
1801 false); 1762 false);
1802 optimized->shared()->DontAdaptArguments(); 1763 optimized->shared()->DontAdaptArguments();
1803 SetProperty(holder, key, optimized, NONE, kStrictMode); 1764 SetProperty(holder, key, optimized, NONE, kStrictMode);
1804 return optimized; 1765 return optimized;
1805 } 1766 }
1806 1767
1807 1768
1808 static MaybeObject* Runtime_SpecialArrayFunctions(RUNTIME_CALLING_CONVENTION) { 1769 RUNTIME_FUNCTION(MaybeObject*, Runtime_SpecialArrayFunctions) {
1809 RUNTIME_GET_ISOLATE;
1810 HandleScope scope(isolate); 1770 HandleScope scope(isolate);
1811 ASSERT(args.length() == 1); 1771 ASSERT(args.length() == 1);
1812 CONVERT_ARG_CHECKED(JSObject, holder, 0); 1772 CONVERT_ARG_CHECKED(JSObject, holder, 0);
1813 1773
1814 InstallBuiltin(isolate, holder, "pop", Builtins::kArrayPop); 1774 InstallBuiltin(isolate, holder, "pop", Builtins::kArrayPop);
1815 InstallBuiltin(isolate, holder, "push", Builtins::kArrayPush); 1775 InstallBuiltin(isolate, holder, "push", Builtins::kArrayPush);
1816 InstallBuiltin(isolate, holder, "shift", Builtins::kArrayShift); 1776 InstallBuiltin(isolate, holder, "shift", Builtins::kArrayShift);
1817 InstallBuiltin(isolate, holder, "unshift", Builtins::kArrayUnshift); 1777 InstallBuiltin(isolate, holder, "unshift", Builtins::kArrayUnshift);
1818 InstallBuiltin(isolate, holder, "slice", Builtins::kArraySlice); 1778 InstallBuiltin(isolate, holder, "slice", Builtins::kArraySlice);
1819 InstallBuiltin(isolate, holder, "splice", Builtins::kArraySplice); 1779 InstallBuiltin(isolate, holder, "splice", Builtins::kArraySplice);
1820 InstallBuiltin(isolate, holder, "concat", Builtins::kArrayConcat); 1780 InstallBuiltin(isolate, holder, "concat", Builtins::kArrayConcat);
1821 1781
1822 return *holder; 1782 return *holder;
1823 } 1783 }
1824 1784
1825 1785
1826 static MaybeObject* Runtime_GetGlobalReceiver(RUNTIME_CALLING_CONVENTION) { 1786 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetGlobalReceiver) {
1827 RUNTIME_GET_ISOLATE;
1828 // Returns a real global receiver, not one of builtins object. 1787 // Returns a real global receiver, not one of builtins object.
1829 Context* global_context = 1788 Context* global_context =
1830 isolate->context()->global()->global_context(); 1789 isolate->context()->global()->global_context();
1831 return global_context->global()->global_receiver(); 1790 return global_context->global()->global_receiver();
1832 } 1791 }
1833 1792
1834 1793
1835 static MaybeObject* Runtime_MaterializeRegExpLiteral( 1794 RUNTIME_FUNCTION(MaybeObject*, Runtime_MaterializeRegExpLiteral) {
1836 RUNTIME_CALLING_CONVENTION) {
1837 RUNTIME_GET_ISOLATE;
1838 HandleScope scope(isolate); 1795 HandleScope scope(isolate);
1839 ASSERT(args.length() == 4); 1796 ASSERT(args.length() == 4);
1840 CONVERT_ARG_CHECKED(FixedArray, literals, 0); 1797 CONVERT_ARG_CHECKED(FixedArray, literals, 0);
1841 int index = Smi::cast(args[1])->value(); 1798 int index = Smi::cast(args[1])->value();
1842 Handle<String> pattern = args.at<String>(2); 1799 Handle<String> pattern = args.at<String>(2);
1843 Handle<String> flags = args.at<String>(3); 1800 Handle<String> flags = args.at<String>(3);
1844 1801
1845 // Get the RegExp function from the context in the literals array. 1802 // Get the RegExp function from the context in the literals array.
1846 // This is the RegExp function from the context in which the 1803 // This is the RegExp function from the context in which the
1847 // function was created. We do not use the RegExp function from the 1804 // function was created. We do not use the RegExp function from the
1848 // current global context because this might be the RegExp function 1805 // current global context because this might be the RegExp function
1849 // from another context which we should not have access to. 1806 // from another context which we should not have access to.
1850 Handle<JSFunction> constructor = 1807 Handle<JSFunction> constructor =
1851 Handle<JSFunction>( 1808 Handle<JSFunction>(
1852 JSFunction::GlobalContextFromLiterals(*literals)->regexp_function()); 1809 JSFunction::GlobalContextFromLiterals(*literals)->regexp_function());
1853 // Compute the regular expression literal. 1810 // Compute the regular expression literal.
1854 bool has_pending_exception; 1811 bool has_pending_exception;
1855 Handle<Object> regexp = 1812 Handle<Object> regexp =
1856 RegExpImpl::CreateRegExpLiteral(constructor, pattern, flags, 1813 RegExpImpl::CreateRegExpLiteral(constructor, pattern, flags,
1857 &has_pending_exception); 1814 &has_pending_exception);
1858 if (has_pending_exception) { 1815 if (has_pending_exception) {
1859 ASSERT(isolate->has_pending_exception()); 1816 ASSERT(isolate->has_pending_exception());
1860 return Failure::Exception(); 1817 return Failure::Exception();
1861 } 1818 }
1862 literals->set(index, *regexp); 1819 literals->set(index, *regexp);
1863 return *regexp; 1820 return *regexp;
1864 } 1821 }
1865 1822
1866 1823
1867 static MaybeObject* Runtime_FunctionGetName(RUNTIME_CALLING_CONVENTION) { 1824 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetName) {
1868 RUNTIME_GET_ISOLATE;
1869 NoHandleAllocation ha; 1825 NoHandleAllocation ha;
1870 ASSERT(args.length() == 1); 1826 ASSERT(args.length() == 1);
1871 1827
1872 CONVERT_CHECKED(JSFunction, f, args[0]); 1828 CONVERT_CHECKED(JSFunction, f, args[0]);
1873 return f->shared()->name(); 1829 return f->shared()->name();
1874 } 1830 }
1875 1831
1876 1832
1877 static MaybeObject* Runtime_FunctionSetName(RUNTIME_CALLING_CONVENTION) { 1833 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetName) {
1878 RUNTIME_GET_ISOLATE;
1879 NoHandleAllocation ha; 1834 NoHandleAllocation ha;
1880 ASSERT(args.length() == 2); 1835 ASSERT(args.length() == 2);
1881 1836
1882 CONVERT_CHECKED(JSFunction, f, args[0]); 1837 CONVERT_CHECKED(JSFunction, f, args[0]);
1883 CONVERT_CHECKED(String, name, args[1]); 1838 CONVERT_CHECKED(String, name, args[1]);
1884 f->shared()->set_name(name); 1839 f->shared()->set_name(name);
1885 return isolate->heap()->undefined_value(); 1840 return isolate->heap()->undefined_value();
1886 } 1841 }
1887 1842
1888 1843
1889 static MaybeObject* Runtime_FunctionRemovePrototype( 1844 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionRemovePrototype) {
1890 RUNTIME_CALLING_CONVENTION) {
1891 RUNTIME_GET_ISOLATE;
1892 NoHandleAllocation ha; 1845 NoHandleAllocation ha;
1893 ASSERT(args.length() == 1); 1846 ASSERT(args.length() == 1);
1894 1847
1895 CONVERT_CHECKED(JSFunction, f, args[0]); 1848 CONVERT_CHECKED(JSFunction, f, args[0]);
1896 Object* obj = f->RemovePrototype(); 1849 Object* obj = f->RemovePrototype();
1897 if (obj->IsFailure()) return obj; 1850 if (obj->IsFailure()) return obj;
1898 1851
1899 return isolate->heap()->undefined_value(); 1852 return isolate->heap()->undefined_value();
1900 } 1853 }
1901 1854
1902 1855
1903 static MaybeObject* Runtime_FunctionGetScript(RUNTIME_CALLING_CONVENTION) { 1856 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetScript) {
1904 RUNTIME_GET_ISOLATE;
1905 HandleScope scope(isolate); 1857 HandleScope scope(isolate);
1906 ASSERT(args.length() == 1); 1858 ASSERT(args.length() == 1);
1907 1859
1908 CONVERT_CHECKED(JSFunction, fun, args[0]); 1860 CONVERT_CHECKED(JSFunction, fun, args[0]);
1909 Handle<Object> script = Handle<Object>(fun->shared()->script(), isolate); 1861 Handle<Object> script = Handle<Object>(fun->shared()->script(), isolate);
1910 if (!script->IsScript()) return isolate->heap()->undefined_value(); 1862 if (!script->IsScript()) return isolate->heap()->undefined_value();
1911 1863
1912 return *GetScriptWrapper(Handle<Script>::cast(script)); 1864 return *GetScriptWrapper(Handle<Script>::cast(script));
1913 } 1865 }
1914 1866
1915 1867
1916 static MaybeObject* Runtime_FunctionGetSourceCode(RUNTIME_CALLING_CONVENTION) { 1868 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetSourceCode) {
1917 RUNTIME_GET_ISOLATE;
1918 NoHandleAllocation ha; 1869 NoHandleAllocation ha;
1919 ASSERT(args.length() == 1); 1870 ASSERT(args.length() == 1);
1920 1871
1921 CONVERT_CHECKED(JSFunction, f, args[0]); 1872 CONVERT_CHECKED(JSFunction, f, args[0]);
1922 return f->shared()->GetSourceCode(); 1873 return f->shared()->GetSourceCode();
1923 } 1874 }
1924 1875
1925 1876
1926 static MaybeObject* Runtime_FunctionGetScriptSourcePosition( 1877 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetScriptSourcePosition) {
1927 RUNTIME_CALLING_CONVENTION) {
1928 RUNTIME_GET_ISOLATE;
1929 NoHandleAllocation ha; 1878 NoHandleAllocation ha;
1930 ASSERT(args.length() == 1); 1879 ASSERT(args.length() == 1);
1931 1880
1932 CONVERT_CHECKED(JSFunction, fun, args[0]); 1881 CONVERT_CHECKED(JSFunction, fun, args[0]);
1933 int pos = fun->shared()->start_position(); 1882 int pos = fun->shared()->start_position();
1934 return Smi::FromInt(pos); 1883 return Smi::FromInt(pos);
1935 } 1884 }
1936 1885
1937 1886
1938 static MaybeObject* Runtime_FunctionGetPositionForOffset( 1887 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetPositionForOffset) {
1939 RUNTIME_CALLING_CONVENTION) {
1940 RUNTIME_GET_ISOLATE;
1941 ASSERT(args.length() == 2); 1888 ASSERT(args.length() == 2);
1942 1889
1943 CONVERT_CHECKED(Code, code, args[0]); 1890 CONVERT_CHECKED(Code, code, args[0]);
1944 CONVERT_NUMBER_CHECKED(int, offset, Int32, args[1]); 1891 CONVERT_NUMBER_CHECKED(int, offset, Int32, args[1]);
1945 1892
1946 RUNTIME_ASSERT(0 <= offset && offset < code->Size()); 1893 RUNTIME_ASSERT(0 <= offset && offset < code->Size());
1947 1894
1948 Address pc = code->address() + offset; 1895 Address pc = code->address() + offset;
1949 return Smi::FromInt(code->SourcePosition(pc)); 1896 return Smi::FromInt(code->SourcePosition(pc));
1950 } 1897 }
1951 1898
1952 1899
1953 static MaybeObject* Runtime_FunctionSetInstanceClassName( 1900 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetInstanceClassName) {
1954 RUNTIME_CALLING_CONVENTION) {
1955 RUNTIME_GET_ISOLATE;
1956 NoHandleAllocation ha; 1901 NoHandleAllocation ha;
1957 ASSERT(args.length() == 2); 1902 ASSERT(args.length() == 2);
1958 1903
1959 CONVERT_CHECKED(JSFunction, fun, args[0]); 1904 CONVERT_CHECKED(JSFunction, fun, args[0]);
1960 CONVERT_CHECKED(String, name, args[1]); 1905 CONVERT_CHECKED(String, name, args[1]);
1961 fun->SetInstanceClassName(name); 1906 fun->SetInstanceClassName(name);
1962 return isolate->heap()->undefined_value(); 1907 return isolate->heap()->undefined_value();
1963 } 1908 }
1964 1909
1965 1910
1966 static MaybeObject* Runtime_FunctionSetLength(RUNTIME_CALLING_CONVENTION) { 1911 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetLength) {
1967 RUNTIME_GET_ISOLATE;
1968 NoHandleAllocation ha; 1912 NoHandleAllocation ha;
1969 ASSERT(args.length() == 2); 1913 ASSERT(args.length() == 2);
1970 1914
1971 CONVERT_CHECKED(JSFunction, fun, args[0]); 1915 CONVERT_CHECKED(JSFunction, fun, args[0]);
1972 CONVERT_CHECKED(Smi, length, args[1]); 1916 CONVERT_CHECKED(Smi, length, args[1]);
1973 fun->shared()->set_length(length->value()); 1917 fun->shared()->set_length(length->value());
1974 return length; 1918 return length;
1975 } 1919 }
1976 1920
1977 1921
1978 static MaybeObject* Runtime_FunctionSetPrototype(RUNTIME_CALLING_CONVENTION) { 1922 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetPrototype) {
1979 RUNTIME_GET_ISOLATE;
1980 NoHandleAllocation ha; 1923 NoHandleAllocation ha;
1981 ASSERT(args.length() == 2); 1924 ASSERT(args.length() == 2);
1982 1925
1983 CONVERT_CHECKED(JSFunction, fun, args[0]); 1926 CONVERT_CHECKED(JSFunction, fun, args[0]);
1984 ASSERT(fun->should_have_prototype()); 1927 ASSERT(fun->should_have_prototype());
1985 Object* obj; 1928 Object* obj;
1986 { MaybeObject* maybe_obj = 1929 { MaybeObject* maybe_obj =
1987 Accessors::FunctionSetPrototype(fun, args[1], NULL); 1930 Accessors::FunctionSetPrototype(fun, args[1], NULL);
1988 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 1931 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
1989 } 1932 }
1990 return args[0]; // return TOS 1933 return args[0]; // return TOS
1991 } 1934 }
1992 1935
1993 1936
1994 static MaybeObject* Runtime_FunctionIsAPIFunction(RUNTIME_CALLING_CONVENTION) { 1937 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionIsAPIFunction) {
1995 RUNTIME_GET_ISOLATE;
1996 NoHandleAllocation ha; 1938 NoHandleAllocation ha;
1997 ASSERT(args.length() == 1); 1939 ASSERT(args.length() == 1);
1998 1940
1999 CONVERT_CHECKED(JSFunction, f, args[0]); 1941 CONVERT_CHECKED(JSFunction, f, args[0]);
2000 return f->shared()->IsApiFunction() ? isolate->heap()->true_value() 1942 return f->shared()->IsApiFunction() ? isolate->heap()->true_value()
2001 : isolate->heap()->false_value(); 1943 : isolate->heap()->false_value();
2002 } 1944 }
2003 1945
2004 1946
2005 static MaybeObject* Runtime_FunctionIsBuiltin(RUNTIME_CALLING_CONVENTION) { 1947 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionIsBuiltin) {
2006 RUNTIME_GET_ISOLATE;
2007 NoHandleAllocation ha; 1948 NoHandleAllocation ha;
2008 ASSERT(args.length() == 1); 1949 ASSERT(args.length() == 1);
2009 1950
2010 CONVERT_CHECKED(JSFunction, f, args[0]); 1951 CONVERT_CHECKED(JSFunction, f, args[0]);
2011 return f->IsBuiltin() ? isolate->heap()->true_value() : 1952 return f->IsBuiltin() ? isolate->heap()->true_value() :
2012 isolate->heap()->false_value(); 1953 isolate->heap()->false_value();
2013 } 1954 }
2014 1955
2015 1956
2016 static MaybeObject* Runtime_SetCode(RUNTIME_CALLING_CONVENTION) { 1957 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetCode) {
2017 RUNTIME_GET_ISOLATE;
2018 HandleScope scope(isolate); 1958 HandleScope scope(isolate);
2019 ASSERT(args.length() == 2); 1959 ASSERT(args.length() == 2);
2020 1960
2021 CONVERT_ARG_CHECKED(JSFunction, target, 0); 1961 CONVERT_ARG_CHECKED(JSFunction, target, 0);
2022 Handle<Object> code = args.at<Object>(1); 1962 Handle<Object> code = args.at<Object>(1);
2023 1963
2024 Handle<Context> context(target->context()); 1964 Handle<Context> context(target->context());
2025 1965
2026 if (!code->IsNull()) { 1966 if (!code->IsNull()) {
2027 RUNTIME_ASSERT(code->IsJSFunction()); 1967 RUNTIME_ASSERT(code->IsJSFunction());
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2070 // are guaranteed to be in old space. 2010 // are guaranteed to be in old space.
2071 target->set_literals(*literals, SKIP_WRITE_BARRIER); 2011 target->set_literals(*literals, SKIP_WRITE_BARRIER);
2072 target->set_next_function_link(isolate->heap()->undefined_value()); 2012 target->set_next_function_link(isolate->heap()->undefined_value());
2073 } 2013 }
2074 2014
2075 target->set_context(*context); 2015 target->set_context(*context);
2076 return *target; 2016 return *target;
2077 } 2017 }
2078 2018
2079 2019
2080 static MaybeObject* Runtime_SetExpectedNumberOfProperties( 2020 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetExpectedNumberOfProperties) {
2081 RUNTIME_CALLING_CONVENTION) {
2082 RUNTIME_GET_ISOLATE;
2083 HandleScope scope(isolate); 2021 HandleScope scope(isolate);
2084 ASSERT(args.length() == 2); 2022 ASSERT(args.length() == 2);
2085 CONVERT_ARG_CHECKED(JSFunction, function, 0); 2023 CONVERT_ARG_CHECKED(JSFunction, function, 0);
2086 CONVERT_SMI_CHECKED(num, args[1]); 2024 CONVERT_SMI_CHECKED(num, args[1]);
2087 RUNTIME_ASSERT(num >= 0); 2025 RUNTIME_ASSERT(num >= 0);
2088 SetExpectedNofProperties(function, num); 2026 SetExpectedNofProperties(function, num);
2089 return isolate->heap()->undefined_value(); 2027 return isolate->heap()->undefined_value();
2090 } 2028 }
2091 2029
2092 2030
2093 MUST_USE_RESULT static MaybeObject* CharFromCode(Isolate* isolate, 2031 MUST_USE_RESULT static MaybeObject* CharFromCode(Isolate* isolate,
2094 Object* char_code) { 2032 Object* char_code) {
2095 uint32_t code; 2033 uint32_t code;
2096 if (char_code->ToArrayIndex(&code)) { 2034 if (char_code->ToArrayIndex(&code)) {
2097 if (code <= 0xffff) { 2035 if (code <= 0xffff) {
2098 return isolate->heap()->LookupSingleCharacterStringFromCode(code); 2036 return isolate->heap()->LookupSingleCharacterStringFromCode(code);
2099 } 2037 }
2100 } 2038 }
2101 return isolate->heap()->empty_string(); 2039 return isolate->heap()->empty_string();
2102 } 2040 }
2103 2041
2104 2042
2105 static MaybeObject* Runtime_StringCharCodeAt(RUNTIME_CALLING_CONVENTION) { 2043 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCharCodeAt) {
2106 RUNTIME_GET_ISOLATE;
2107 NoHandleAllocation ha; 2044 NoHandleAllocation ha;
2108 ASSERT(args.length() == 2); 2045 ASSERT(args.length() == 2);
2109 2046
2110 CONVERT_CHECKED(String, subject, args[0]); 2047 CONVERT_CHECKED(String, subject, args[0]);
2111 Object* index = args[1]; 2048 Object* index = args[1];
2112 RUNTIME_ASSERT(index->IsNumber()); 2049 RUNTIME_ASSERT(index->IsNumber());
2113 2050
2114 uint32_t i = 0; 2051 uint32_t i = 0;
2115 if (index->IsSmi()) { 2052 if (index->IsSmi()) {
2116 int value = Smi::cast(index)->value(); 2053 int value = Smi::cast(index)->value();
(...skipping 15 matching lines...) Expand all
2132 subject = String::cast(flat); 2069 subject = String::cast(flat);
2133 2070
2134 if (i >= static_cast<uint32_t>(subject->length())) { 2071 if (i >= static_cast<uint32_t>(subject->length())) {
2135 return isolate->heap()->nan_value(); 2072 return isolate->heap()->nan_value();
2136 } 2073 }
2137 2074
2138 return Smi::FromInt(subject->Get(i)); 2075 return Smi::FromInt(subject->Get(i));
2139 } 2076 }
2140 2077
2141 2078
2142 static MaybeObject* Runtime_CharFromCode(RUNTIME_CALLING_CONVENTION) { 2079 RUNTIME_FUNCTION(MaybeObject*, Runtime_CharFromCode) {
2143 RUNTIME_GET_ISOLATE;
2144 NoHandleAllocation ha; 2080 NoHandleAllocation ha;
2145 ASSERT(args.length() == 1); 2081 ASSERT(args.length() == 1);
2146 return CharFromCode(isolate, args[0]); 2082 return CharFromCode(isolate, args[0]);
2147 } 2083 }
2148 2084
2149 2085
2150 class FixedArrayBuilder { 2086 class FixedArrayBuilder {
2151 public: 2087 public:
2152 explicit FixedArrayBuilder(Isolate* isolate, int initial_capacity) 2088 explicit FixedArrayBuilder(Isolate* isolate, int initial_capacity)
2153 : array_(isolate->factory()->NewFixedArrayWithHoles(initial_capacity)), 2089 : array_(isolate->factory()->NewFixedArrayWithHoles(initial_capacity)),
(...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after
2867 answer->set_length(position); 2803 answer->set_length(position);
2868 if (delta == 0) return *answer; 2804 if (delta == 0) return *answer;
2869 2805
2870 Address end_of_string = answer->address() + string_size; 2806 Address end_of_string = answer->address() + string_size;
2871 isolate->heap()->CreateFillerObjectAt(end_of_string, delta); 2807 isolate->heap()->CreateFillerObjectAt(end_of_string, delta);
2872 2808
2873 return *answer; 2809 return *answer;
2874 } 2810 }
2875 2811
2876 2812
2877 static MaybeObject* Runtime_StringReplaceRegExpWithString( 2813 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringReplaceRegExpWithString) {
2878 RUNTIME_CALLING_CONVENTION) {
2879 RUNTIME_GET_ISOLATE;
2880 ASSERT(args.length() == 4); 2814 ASSERT(args.length() == 4);
2881 2815
2882 CONVERT_CHECKED(String, subject, args[0]); 2816 CONVERT_CHECKED(String, subject, args[0]);
2883 if (!subject->IsFlat()) { 2817 if (!subject->IsFlat()) {
2884 Object* flat_subject; 2818 Object* flat_subject;
2885 { MaybeObject* maybe_flat_subject = subject->TryFlatten(); 2819 { MaybeObject* maybe_flat_subject = subject->TryFlatten();
2886 if (!maybe_flat_subject->ToObject(&flat_subject)) { 2820 if (!maybe_flat_subject->ToObject(&flat_subject)) {
2887 return maybe_flat_subject; 2821 return maybe_flat_subject;
2888 } 2822 }
2889 } 2823 }
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
2971 pat_vector, 2905 pat_vector,
2972 start_index); 2906 start_index);
2973 } 2907 }
2974 return SearchString(isolate, 2908 return SearchString(isolate,
2975 seq_sub->ToUC16Vector(), 2909 seq_sub->ToUC16Vector(),
2976 pat_vector, 2910 pat_vector,
2977 start_index); 2911 start_index);
2978 } 2912 }
2979 2913
2980 2914
2981 static MaybeObject* Runtime_StringIndexOf(RUNTIME_CALLING_CONVENTION) { 2915 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringIndexOf) {
2982 RUNTIME_GET_ISOLATE;
2983 HandleScope scope(isolate); // create a new handle scope 2916 HandleScope scope(isolate); // create a new handle scope
2984 ASSERT(args.length() == 3); 2917 ASSERT(args.length() == 3);
2985 2918
2986 CONVERT_ARG_CHECKED(String, sub, 0); 2919 CONVERT_ARG_CHECKED(String, sub, 0);
2987 CONVERT_ARG_CHECKED(String, pat, 1); 2920 CONVERT_ARG_CHECKED(String, pat, 1);
2988 2921
2989 Object* index = args[2]; 2922 Object* index = args[2];
2990 uint32_t start_index; 2923 uint32_t start_index;
2991 if (!index->ToArrayIndex(&start_index)) return Smi::FromInt(-1); 2924 if (!index->ToArrayIndex(&start_index)) return Smi::FromInt(-1);
2992 2925
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
3024 } 2957 }
3025 j++; 2958 j++;
3026 } 2959 }
3027 if (j == pattern_length) { 2960 if (j == pattern_length) {
3028 return i; 2961 return i;
3029 } 2962 }
3030 } 2963 }
3031 return -1; 2964 return -1;
3032 } 2965 }
3033 2966
3034 static MaybeObject* Runtime_StringLastIndexOf(RUNTIME_CALLING_CONVENTION) { 2967 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringLastIndexOf) {
3035 RUNTIME_GET_ISOLATE;
3036 HandleScope scope(isolate); // create a new handle scope 2968 HandleScope scope(isolate); // create a new handle scope
3037 ASSERT(args.length() == 3); 2969 ASSERT(args.length() == 3);
3038 2970
3039 CONVERT_ARG_CHECKED(String, sub, 0); 2971 CONVERT_ARG_CHECKED(String, sub, 0);
3040 CONVERT_ARG_CHECKED(String, pat, 1); 2972 CONVERT_ARG_CHECKED(String, pat, 1);
3041 2973
3042 Object* index = args[2]; 2974 Object* index = args[2];
3043 uint32_t start_index; 2975 uint32_t start_index;
3044 if (!index->ToArrayIndex(&start_index)) return Smi::FromInt(-1); 2976 if (!index->ToArrayIndex(&start_index)) return Smi::FromInt(-1);
3045 2977
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
3082 position = StringMatchBackwards(sub->ToUC16Vector(), 3014 position = StringMatchBackwards(sub->ToUC16Vector(),
3083 pat_vector, 3015 pat_vector,
3084 start_index); 3016 start_index);
3085 } 3017 }
3086 } 3018 }
3087 3019
3088 return Smi::FromInt(position); 3020 return Smi::FromInt(position);
3089 } 3021 }
3090 3022
3091 3023
3092 static MaybeObject* Runtime_StringLocaleCompare(RUNTIME_CALLING_CONVENTION) { 3024 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringLocaleCompare) {
3093 RUNTIME_GET_ISOLATE;
3094 NoHandleAllocation ha; 3025 NoHandleAllocation ha;
3095 ASSERT(args.length() == 2); 3026 ASSERT(args.length() == 2);
3096 3027
3097 CONVERT_CHECKED(String, str1, args[0]); 3028 CONVERT_CHECKED(String, str1, args[0]);
3098 CONVERT_CHECKED(String, str2, args[1]); 3029 CONVERT_CHECKED(String, str2, args[1]);
3099 3030
3100 if (str1 == str2) return Smi::FromInt(0); // Equal. 3031 if (str1 == str2) return Smi::FromInt(0); // Equal.
3101 int str1_length = str1->length(); 3032 int str1_length = str1->length();
3102 int str2_length = str2->length(); 3033 int str2_length = str2->length();
3103 3034
(...skipping 27 matching lines...) Expand all
3131 for (int i = 0; i < end; i++) { 3062 for (int i = 0; i < end; i++) {
3132 uint16_t char1 = buf1.GetNext(); 3063 uint16_t char1 = buf1.GetNext();
3133 uint16_t char2 = buf2.GetNext(); 3064 uint16_t char2 = buf2.GetNext();
3134 if (char1 != char2) return Smi::FromInt(char1 - char2); 3065 if (char1 != char2) return Smi::FromInt(char1 - char2);
3135 } 3066 }
3136 3067
3137 return Smi::FromInt(str1_length - str2_length); 3068 return Smi::FromInt(str1_length - str2_length);
3138 } 3069 }
3139 3070
3140 3071
3141 static MaybeObject* Runtime_SubString(RUNTIME_CALLING_CONVENTION) { 3072 RUNTIME_FUNCTION(MaybeObject*, Runtime_SubString) {
3142 RUNTIME_GET_ISOLATE;
3143 NoHandleAllocation ha; 3073 NoHandleAllocation ha;
3144 ASSERT(args.length() == 3); 3074 ASSERT(args.length() == 3);
3145 3075
3146 CONVERT_CHECKED(String, value, args[0]); 3076 CONVERT_CHECKED(String, value, args[0]);
3147 Object* from = args[1]; 3077 Object* from = args[1];
3148 Object* to = args[2]; 3078 Object* to = args[2];
3149 int start, end; 3079 int start, end;
3150 // We have a fast integer-only case here to avoid a conversion to double in 3080 // We have a fast integer-only case here to avoid a conversion to double in
3151 // the common case where from and to are Smis. 3081 // the common case where from and to are Smis.
3152 if (from->IsSmi() && to->IsSmi()) { 3082 if (from->IsSmi() && to->IsSmi()) {
3153 start = Smi::cast(from)->value(); 3083 start = Smi::cast(from)->value();
3154 end = Smi::cast(to)->value(); 3084 end = Smi::cast(to)->value();
3155 } else { 3085 } else {
3156 CONVERT_DOUBLE_CHECKED(from_number, from); 3086 CONVERT_DOUBLE_CHECKED(from_number, from);
3157 CONVERT_DOUBLE_CHECKED(to_number, to); 3087 CONVERT_DOUBLE_CHECKED(to_number, to);
3158 start = FastD2I(from_number); 3088 start = FastD2I(from_number);
3159 end = FastD2I(to_number); 3089 end = FastD2I(to_number);
3160 } 3090 }
3161 RUNTIME_ASSERT(end >= start); 3091 RUNTIME_ASSERT(end >= start);
3162 RUNTIME_ASSERT(start >= 0); 3092 RUNTIME_ASSERT(start >= 0);
3163 RUNTIME_ASSERT(end <= value->length()); 3093 RUNTIME_ASSERT(end <= value->length());
3164 isolate->counters()->sub_string_runtime()->Increment(); 3094 isolate->counters()->sub_string_runtime()->Increment();
3165 return value->SubString(start, end); 3095 return value->SubString(start, end);
3166 } 3096 }
3167 3097
3168 3098
3169 static MaybeObject* Runtime_StringMatch(RUNTIME_CALLING_CONVENTION) { 3099 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringMatch) {
3170 RUNTIME_GET_ISOLATE;
3171 ASSERT_EQ(3, args.length()); 3100 ASSERT_EQ(3, args.length());
3172 3101
3173 CONVERT_ARG_CHECKED(String, subject, 0); 3102 CONVERT_ARG_CHECKED(String, subject, 0);
3174 CONVERT_ARG_CHECKED(JSRegExp, regexp, 1); 3103 CONVERT_ARG_CHECKED(JSRegExp, regexp, 1);
3175 CONVERT_ARG_CHECKED(JSArray, regexp_info, 2); 3104 CONVERT_ARG_CHECKED(JSArray, regexp_info, 2);
3176 HandleScope handles; 3105 HandleScope handles;
3177 3106
3178 Handle<Object> match = RegExpImpl::Exec(regexp, subject, 0, regexp_info); 3107 Handle<Object> match = RegExpImpl::Exec(regexp, subject, 0, regexp_info);
3179 3108
3180 if (match.is_null()) { 3109 if (match.is_null()) {
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after
3526 RegExpImpl::SetCapture(elements, i, prev_register_vector[i]); 3455 RegExpImpl::SetCapture(elements, i, prev_register_vector[i]);
3527 } 3456 }
3528 return RegExpImpl::RE_SUCCESS; 3457 return RegExpImpl::RE_SUCCESS;
3529 } 3458 }
3530 } 3459 }
3531 // No matches at all, return failure or exception result directly. 3460 // No matches at all, return failure or exception result directly.
3532 return result; 3461 return result;
3533 } 3462 }
3534 3463
3535 3464
3536 static MaybeObject* Runtime_RegExpExecMultiple(RUNTIME_CALLING_CONVENTION) { 3465 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpExecMultiple) {
3537 RUNTIME_GET_ISOLATE;
3538 ASSERT(args.length() == 4); 3466 ASSERT(args.length() == 4);
3539 HandleScope handles(isolate); 3467 HandleScope handles(isolate);
3540 3468
3541 CONVERT_ARG_CHECKED(String, subject, 1); 3469 CONVERT_ARG_CHECKED(String, subject, 1);
3542 if (!subject->IsFlat()) { FlattenString(subject); } 3470 if (!subject->IsFlat()) { FlattenString(subject); }
3543 CONVERT_ARG_CHECKED(JSRegExp, regexp, 0); 3471 CONVERT_ARG_CHECKED(JSRegExp, regexp, 0);
3544 CONVERT_ARG_CHECKED(JSArray, last_match_info, 2); 3472 CONVERT_ARG_CHECKED(JSArray, last_match_info, 2);
3545 CONVERT_ARG_CHECKED(JSArray, result_array, 3); 3473 CONVERT_ARG_CHECKED(JSArray, result_array, 3);
3546 3474
3547 ASSERT(last_match_info->HasFastElements()); 3475 ASSERT(last_match_info->HasFastElements());
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
3582 last_match_info, 3510 last_match_info,
3583 &builder); 3511 &builder);
3584 } 3512 }
3585 if (result == RegExpImpl::RE_SUCCESS) return *builder.ToJSArray(result_array); 3513 if (result == RegExpImpl::RE_SUCCESS) return *builder.ToJSArray(result_array);
3586 if (result == RegExpImpl::RE_FAILURE) return isolate->heap()->null_value(); 3514 if (result == RegExpImpl::RE_FAILURE) return isolate->heap()->null_value();
3587 ASSERT_EQ(result, RegExpImpl::RE_EXCEPTION); 3515 ASSERT_EQ(result, RegExpImpl::RE_EXCEPTION);
3588 return Failure::Exception(); 3516 return Failure::Exception();
3589 } 3517 }
3590 3518
3591 3519
3592 static MaybeObject* Runtime_NumberToRadixString(RUNTIME_CALLING_CONVENTION) { 3520 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToRadixString) {
3593 RUNTIME_GET_ISOLATE;
3594 NoHandleAllocation ha; 3521 NoHandleAllocation ha;
3595 ASSERT(args.length() == 2); 3522 ASSERT(args.length() == 2);
3596 3523
3597 // Fast case where the result is a one character string. 3524 // Fast case where the result is a one character string.
3598 if (args[0]->IsSmi() && args[1]->IsSmi()) { 3525 if (args[0]->IsSmi() && args[1]->IsSmi()) {
3599 int value = Smi::cast(args[0])->value(); 3526 int value = Smi::cast(args[0])->value();
3600 int radix = Smi::cast(args[1])->value(); 3527 int radix = Smi::cast(args[1])->value();
3601 if (value >= 0 && value < radix) { 3528 if (value >= 0 && value < radix) {
3602 RUNTIME_ASSERT(radix <= 36); 3529 RUNTIME_ASSERT(radix <= 36);
3603 // Character array used for conversion. 3530 // Character array used for conversion.
(...skipping 18 matching lines...) Expand all
3622 int radix = FastD2I(radix_number); 3549 int radix = FastD2I(radix_number);
3623 RUNTIME_ASSERT(2 <= radix && radix <= 36); 3550 RUNTIME_ASSERT(2 <= radix && radix <= 36);
3624 char* str = DoubleToRadixCString(value, radix); 3551 char* str = DoubleToRadixCString(value, radix);
3625 MaybeObject* result = 3552 MaybeObject* result =
3626 isolate->heap()->AllocateStringFromAscii(CStrVector(str)); 3553 isolate->heap()->AllocateStringFromAscii(CStrVector(str));
3627 DeleteArray(str); 3554 DeleteArray(str);
3628 return result; 3555 return result;
3629 } 3556 }
3630 3557
3631 3558
3632 static MaybeObject* Runtime_NumberToFixed(RUNTIME_CALLING_CONVENTION) { 3559 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToFixed) {
3633 RUNTIME_GET_ISOLATE;
3634 NoHandleAllocation ha; 3560 NoHandleAllocation ha;
3635 ASSERT(args.length() == 2); 3561 ASSERT(args.length() == 2);
3636 3562
3637 CONVERT_DOUBLE_CHECKED(value, args[0]); 3563 CONVERT_DOUBLE_CHECKED(value, args[0]);
3638 if (isnan(value)) { 3564 if (isnan(value)) {
3639 return isolate->heap()->AllocateStringFromAscii(CStrVector("NaN")); 3565 return isolate->heap()->AllocateStringFromAscii(CStrVector("NaN"));
3640 } 3566 }
3641 if (isinf(value)) { 3567 if (isinf(value)) {
3642 if (value < 0) { 3568 if (value < 0) {
3643 return isolate->heap()->AllocateStringFromAscii(CStrVector("-Infinity")); 3569 return isolate->heap()->AllocateStringFromAscii(CStrVector("-Infinity"));
3644 } 3570 }
3645 return isolate->heap()->AllocateStringFromAscii(CStrVector("Infinity")); 3571 return isolate->heap()->AllocateStringFromAscii(CStrVector("Infinity"));
3646 } 3572 }
3647 CONVERT_DOUBLE_CHECKED(f_number, args[1]); 3573 CONVERT_DOUBLE_CHECKED(f_number, args[1]);
3648 int f = FastD2I(f_number); 3574 int f = FastD2I(f_number);
3649 RUNTIME_ASSERT(f >= 0); 3575 RUNTIME_ASSERT(f >= 0);
3650 char* str = DoubleToFixedCString(value, f); 3576 char* str = DoubleToFixedCString(value, f);
3651 MaybeObject* res = 3577 MaybeObject* res =
3652 isolate->heap()->AllocateStringFromAscii(CStrVector(str)); 3578 isolate->heap()->AllocateStringFromAscii(CStrVector(str));
3653 DeleteArray(str); 3579 DeleteArray(str);
3654 return res; 3580 return res;
3655 } 3581 }
3656 3582
3657 3583
3658 static MaybeObject* Runtime_NumberToExponential(RUNTIME_CALLING_CONVENTION) { 3584 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToExponential) {
3659 RUNTIME_GET_ISOLATE;
3660 NoHandleAllocation ha; 3585 NoHandleAllocation ha;
3661 ASSERT(args.length() == 2); 3586 ASSERT(args.length() == 2);
3662 3587
3663 CONVERT_DOUBLE_CHECKED(value, args[0]); 3588 CONVERT_DOUBLE_CHECKED(value, args[0]);
3664 if (isnan(value)) { 3589 if (isnan(value)) {
3665 return isolate->heap()->AllocateStringFromAscii(CStrVector("NaN")); 3590 return isolate->heap()->AllocateStringFromAscii(CStrVector("NaN"));
3666 } 3591 }
3667 if (isinf(value)) { 3592 if (isinf(value)) {
3668 if (value < 0) { 3593 if (value < 0) {
3669 return isolate->heap()->AllocateStringFromAscii(CStrVector("-Infinity")); 3594 return isolate->heap()->AllocateStringFromAscii(CStrVector("-Infinity"));
3670 } 3595 }
3671 return isolate->heap()->AllocateStringFromAscii(CStrVector("Infinity")); 3596 return isolate->heap()->AllocateStringFromAscii(CStrVector("Infinity"));
3672 } 3597 }
3673 CONVERT_DOUBLE_CHECKED(f_number, args[1]); 3598 CONVERT_DOUBLE_CHECKED(f_number, args[1]);
3674 int f = FastD2I(f_number); 3599 int f = FastD2I(f_number);
3675 RUNTIME_ASSERT(f >= -1 && f <= 20); 3600 RUNTIME_ASSERT(f >= -1 && f <= 20);
3676 char* str = DoubleToExponentialCString(value, f); 3601 char* str = DoubleToExponentialCString(value, f);
3677 MaybeObject* res = 3602 MaybeObject* res =
3678 isolate->heap()->AllocateStringFromAscii(CStrVector(str)); 3603 isolate->heap()->AllocateStringFromAscii(CStrVector(str));
3679 DeleteArray(str); 3604 DeleteArray(str);
3680 return res; 3605 return res;
3681 } 3606 }
3682 3607
3683 3608
3684 static MaybeObject* Runtime_NumberToPrecision(RUNTIME_CALLING_CONVENTION) { 3609 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToPrecision) {
3685 RUNTIME_GET_ISOLATE;
3686 NoHandleAllocation ha; 3610 NoHandleAllocation ha;
3687 ASSERT(args.length() == 2); 3611 ASSERT(args.length() == 2);
3688 3612
3689 CONVERT_DOUBLE_CHECKED(value, args[0]); 3613 CONVERT_DOUBLE_CHECKED(value, args[0]);
3690 if (isnan(value)) { 3614 if (isnan(value)) {
3691 return isolate->heap()->AllocateStringFromAscii(CStrVector("NaN")); 3615 return isolate->heap()->AllocateStringFromAscii(CStrVector("NaN"));
3692 } 3616 }
3693 if (isinf(value)) { 3617 if (isinf(value)) {
3694 if (value < 0) { 3618 if (value < 0) {
3695 return isolate->heap()->AllocateStringFromAscii(CStrVector("-Infinity")); 3619 return isolate->heap()->AllocateStringFromAscii(CStrVector("-Infinity"));
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
3785 // the element if so. 3709 // the element if so.
3786 if (name->AsArrayIndex(&index)) { 3710 if (name->AsArrayIndex(&index)) {
3787 return GetElementOrCharAt(isolate, object, index); 3711 return GetElementOrCharAt(isolate, object, index);
3788 } else { 3712 } else {
3789 PropertyAttributes attr; 3713 PropertyAttributes attr;
3790 return object->GetProperty(*name, &attr); 3714 return object->GetProperty(*name, &attr);
3791 } 3715 }
3792 } 3716 }
3793 3717
3794 3718
3795 static MaybeObject* Runtime_GetProperty(RUNTIME_CALLING_CONVENTION) { 3719 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetProperty) {
3796 RUNTIME_GET_ISOLATE;
3797 NoHandleAllocation ha; 3720 NoHandleAllocation ha;
3798 ASSERT(args.length() == 2); 3721 ASSERT(args.length() == 2);
3799 3722
3800 Handle<Object> object = args.at<Object>(0); 3723 Handle<Object> object = args.at<Object>(0);
3801 Handle<Object> key = args.at<Object>(1); 3724 Handle<Object> key = args.at<Object>(1);
3802 3725
3803 return Runtime::GetObjectProperty(isolate, object, key); 3726 return Runtime::GetObjectProperty(isolate, object, key);
3804 } 3727 }
3805 3728
3806 3729
3807 // KeyedStringGetProperty is called from KeyedLoadIC::GenerateGeneric. 3730 // KeyedStringGetProperty is called from KeyedLoadIC::GenerateGeneric.
3808 static MaybeObject* Runtime_KeyedGetProperty(RUNTIME_CALLING_CONVENTION) { 3731 RUNTIME_FUNCTION(MaybeObject*, Runtime_KeyedGetProperty) {
3809 RUNTIME_GET_ISOLATE;
3810 NoHandleAllocation ha; 3732 NoHandleAllocation ha;
3811 ASSERT(args.length() == 2); 3733 ASSERT(args.length() == 2);
3812 3734
3813 // Fast cases for getting named properties of the receiver JSObject 3735 // Fast cases for getting named properties of the receiver JSObject
3814 // itself. 3736 // itself.
3815 // 3737 //
3816 // The global proxy objects has to be excluded since LocalLookup on 3738 // The global proxy objects has to be excluded since LocalLookup on
3817 // the global proxy object can return a valid result even though the 3739 // the global proxy object can return a valid result even though the
3818 // global proxy object never has properties. This is the case 3740 // global proxy object never has properties. This is the case
3819 // because the global proxy object forwards everything to its hidden 3741 // because the global proxy object forwards everything to its hidden
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
3873 args.at<Object>(0), 3795 args.at<Object>(0),
3874 args.at<Object>(1)); 3796 args.at<Object>(1));
3875 } 3797 }
3876 3798
3877 // Implements part of 8.12.9 DefineOwnProperty. 3799 // Implements part of 8.12.9 DefineOwnProperty.
3878 // There are 3 cases that lead here: 3800 // There are 3 cases that lead here:
3879 // Step 4b - define a new accessor property. 3801 // Step 4b - define a new accessor property.
3880 // Steps 9c & 12 - replace an existing data property with an accessor property. 3802 // Steps 9c & 12 - replace an existing data property with an accessor property.
3881 // Step 12 - update an existing accessor property with an accessor or generic 3803 // Step 12 - update an existing accessor property with an accessor or generic
3882 // descriptor. 3804 // descriptor.
3883 static MaybeObject* Runtime_DefineOrRedefineAccessorProperty( 3805 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineAccessorProperty) {
3884 RUNTIME_CALLING_CONVENTION) {
3885 RUNTIME_GET_ISOLATE;
3886 ASSERT(args.length() == 5); 3806 ASSERT(args.length() == 5);
3887 HandleScope scope(isolate); 3807 HandleScope scope(isolate);
3888 CONVERT_ARG_CHECKED(JSObject, obj, 0); 3808 CONVERT_ARG_CHECKED(JSObject, obj, 0);
3889 CONVERT_CHECKED(String, name, args[1]); 3809 CONVERT_CHECKED(String, name, args[1]);
3890 CONVERT_CHECKED(Smi, flag_setter, args[2]); 3810 CONVERT_CHECKED(Smi, flag_setter, args[2]);
3891 Object* fun = args[3]; 3811 Object* fun = args[3];
3892 RUNTIME_ASSERT(fun->IsJSFunction() || fun->IsUndefined()); 3812 RUNTIME_ASSERT(fun->IsJSFunction() || fun->IsUndefined());
3893 CONVERT_CHECKED(Smi, flag_attr, args[4]); 3813 CONVERT_CHECKED(Smi, flag_attr, args[4]);
3894 int unchecked = flag_attr->value(); 3814 int unchecked = flag_attr->value();
3895 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 3815 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
(...skipping 16 matching lines...) Expand all
3912 } 3832 }
3913 return obj->DefineAccessor(name, flag_setter->value() == 0, fun, attr); 3833 return obj->DefineAccessor(name, flag_setter->value() == 0, fun, attr);
3914 } 3834 }
3915 3835
3916 // Implements part of 8.12.9 DefineOwnProperty. 3836 // Implements part of 8.12.9 DefineOwnProperty.
3917 // There are 3 cases that lead here: 3837 // There are 3 cases that lead here:
3918 // Step 4a - define a new data property. 3838 // Step 4a - define a new data property.
3919 // Steps 9b & 12 - replace an existing accessor property with a data property. 3839 // Steps 9b & 12 - replace an existing accessor property with a data property.
3920 // Step 12 - update an existing data property with a data or generic 3840 // Step 12 - update an existing data property with a data or generic
3921 // descriptor. 3841 // descriptor.
3922 static MaybeObject* Runtime_DefineOrRedefineDataProperty( 3842 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineDataProperty) {
3923 RUNTIME_CALLING_CONVENTION) {
3924 RUNTIME_GET_ISOLATE;
3925 ASSERT(args.length() == 4); 3843 ASSERT(args.length() == 4);
3926 HandleScope scope(isolate); 3844 HandleScope scope(isolate);
3927 CONVERT_ARG_CHECKED(JSObject, js_object, 0); 3845 CONVERT_ARG_CHECKED(JSObject, js_object, 0);
3928 CONVERT_ARG_CHECKED(String, name, 1); 3846 CONVERT_ARG_CHECKED(String, name, 1);
3929 Handle<Object> obj_value = args.at<Object>(2); 3847 Handle<Object> obj_value = args.at<Object>(2);
3930 3848
3931 CONVERT_CHECKED(Smi, flag, args[3]); 3849 CONVERT_CHECKED(Smi, flag, args[3]);
3932 int unchecked = flag->value(); 3850 int unchecked = flag->value();
3933 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 3851 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
3934 3852
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
4150 Handle<Object> converted = Execution::ToString(key, &has_pending_exception); 4068 Handle<Object> converted = Execution::ToString(key, &has_pending_exception);
4151 if (has_pending_exception) return Failure::Exception(); 4069 if (has_pending_exception) return Failure::Exception();
4152 key_string = Handle<String>::cast(converted); 4070 key_string = Handle<String>::cast(converted);
4153 } 4071 }
4154 4072
4155 key_string->TryFlatten(); 4073 key_string->TryFlatten();
4156 return js_object->DeleteProperty(*key_string, JSObject::FORCE_DELETION); 4074 return js_object->DeleteProperty(*key_string, JSObject::FORCE_DELETION);
4157 } 4075 }
4158 4076
4159 4077
4160 static MaybeObject* Runtime_SetProperty(RUNTIME_CALLING_CONVENTION) { 4078 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetProperty) {
4161 RUNTIME_GET_ISOLATE;
4162 NoHandleAllocation ha; 4079 NoHandleAllocation ha;
4163 RUNTIME_ASSERT(args.length() == 4 || args.length() == 5); 4080 RUNTIME_ASSERT(args.length() == 4 || args.length() == 5);
4164 4081
4165 Handle<Object> object = args.at<Object>(0); 4082 Handle<Object> object = args.at<Object>(0);
4166 Handle<Object> key = args.at<Object>(1); 4083 Handle<Object> key = args.at<Object>(1);
4167 Handle<Object> value = args.at<Object>(2); 4084 Handle<Object> value = args.at<Object>(2);
4168 CONVERT_SMI_CHECKED(unchecked_attributes, args[3]); 4085 CONVERT_SMI_CHECKED(unchecked_attributes, args[3]);
4169 RUNTIME_ASSERT( 4086 RUNTIME_ASSERT(
4170 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 4087 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
4171 // Compute attributes. 4088 // Compute attributes.
(...skipping 12 matching lines...) Expand all
4184 object, 4101 object,
4185 key, 4102 key,
4186 value, 4103 value,
4187 attributes, 4104 attributes,
4188 strict_mode); 4105 strict_mode);
4189 } 4106 }
4190 4107
4191 4108
4192 // Set a local property, even if it is READ_ONLY. If the property does not 4109 // Set a local property, even if it is READ_ONLY. If the property does not
4193 // exist, it will be added with attributes NONE. 4110 // exist, it will be added with attributes NONE.
4194 static MaybeObject* Runtime_IgnoreAttributesAndSetProperty( 4111 RUNTIME_FUNCTION(MaybeObject*, Runtime_IgnoreAttributesAndSetProperty) {
4195 RUNTIME_CALLING_CONVENTION) {
4196 RUNTIME_GET_ISOLATE;
4197 NoHandleAllocation ha; 4112 NoHandleAllocation ha;
4198 RUNTIME_ASSERT(args.length() == 3 || args.length() == 4); 4113 RUNTIME_ASSERT(args.length() == 3 || args.length() == 4);
4199 CONVERT_CHECKED(JSObject, object, args[0]); 4114 CONVERT_CHECKED(JSObject, object, args[0]);
4200 CONVERT_CHECKED(String, name, args[1]); 4115 CONVERT_CHECKED(String, name, args[1]);
4201 // Compute attributes. 4116 // Compute attributes.
4202 PropertyAttributes attributes = NONE; 4117 PropertyAttributes attributes = NONE;
4203 if (args.length() == 4) { 4118 if (args.length() == 4) {
4204 CONVERT_CHECKED(Smi, value_obj, args[3]); 4119 CONVERT_CHECKED(Smi, value_obj, args[3]);
4205 int unchecked_value = value_obj->value(); 4120 int unchecked_value = value_obj->value();
4206 // Only attribute bits should be set. 4121 // Only attribute bits should be set.
4207 RUNTIME_ASSERT( 4122 RUNTIME_ASSERT(
4208 (unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 4123 (unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
4209 attributes = static_cast<PropertyAttributes>(unchecked_value); 4124 attributes = static_cast<PropertyAttributes>(unchecked_value);
4210 } 4125 }
4211 4126
4212 return object-> 4127 return object->
4213 SetLocalPropertyIgnoreAttributes(name, args[2], attributes); 4128 SetLocalPropertyIgnoreAttributes(name, args[2], attributes);
4214 } 4129 }
4215 4130
4216 4131
4217 static MaybeObject* Runtime_DeleteProperty(RUNTIME_CALLING_CONVENTION) { 4132 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteProperty) {
4218 RUNTIME_GET_ISOLATE;
4219 NoHandleAllocation ha; 4133 NoHandleAllocation ha;
4220 ASSERT(args.length() == 3); 4134 ASSERT(args.length() == 3);
4221 4135
4222 CONVERT_CHECKED(JSObject, object, args[0]); 4136 CONVERT_CHECKED(JSObject, object, args[0]);
4223 CONVERT_CHECKED(String, key, args[1]); 4137 CONVERT_CHECKED(String, key, args[1]);
4224 CONVERT_SMI_CHECKED(strict, args[2]); 4138 CONVERT_SMI_CHECKED(strict, args[2]);
4225 return object->DeleteProperty(key, (strict == kStrictMode) 4139 return object->DeleteProperty(key, (strict == kStrictMode)
4226 ? JSObject::STRICT_DELETION 4140 ? JSObject::STRICT_DELETION
4227 : JSObject::NORMAL_DELETION); 4141 : JSObject::NORMAL_DELETION);
4228 } 4142 }
(...skipping 10 matching lines...) Expand all
4239 if (proto->IsJSObject() && 4153 if (proto->IsJSObject() &&
4240 Handle<JSObject>::cast(proto)->map()->is_hidden_prototype()) { 4154 Handle<JSObject>::cast(proto)->map()->is_hidden_prototype()) {
4241 return HasLocalPropertyImplementation(isolate, 4155 return HasLocalPropertyImplementation(isolate,
4242 Handle<JSObject>::cast(proto), 4156 Handle<JSObject>::cast(proto),
4243 key); 4157 key);
4244 } 4158 }
4245 return isolate->heap()->false_value(); 4159 return isolate->heap()->false_value();
4246 } 4160 }
4247 4161
4248 4162
4249 static MaybeObject* Runtime_HasLocalProperty(RUNTIME_CALLING_CONVENTION) { 4163 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasLocalProperty) {
4250 RUNTIME_GET_ISOLATE;
4251 NoHandleAllocation ha; 4164 NoHandleAllocation ha;
4252 ASSERT(args.length() == 2); 4165 ASSERT(args.length() == 2);
4253 CONVERT_CHECKED(String, key, args[1]); 4166 CONVERT_CHECKED(String, key, args[1]);
4254 4167
4255 Object* obj = args[0]; 4168 Object* obj = args[0];
4256 // Only JS objects can have properties. 4169 // Only JS objects can have properties.
4257 if (obj->IsJSObject()) { 4170 if (obj->IsJSObject()) {
4258 JSObject* object = JSObject::cast(obj); 4171 JSObject* object = JSObject::cast(obj);
4259 // Fast case - no interceptors. 4172 // Fast case - no interceptors.
4260 if (object->HasRealNamedProperty(key)) return isolate->heap()->true_value(); 4173 if (object->HasRealNamedProperty(key)) return isolate->heap()->true_value();
4261 // Slow case. Either it's not there or we have an interceptor. We should 4174 // Slow case. Either it's not there or we have an interceptor. We should
4262 // have handles for this kind of deal. 4175 // have handles for this kind of deal.
4263 HandleScope scope(isolate); 4176 HandleScope scope(isolate);
4264 return HasLocalPropertyImplementation(isolate, 4177 return HasLocalPropertyImplementation(isolate,
4265 Handle<JSObject>(object), 4178 Handle<JSObject>(object),
4266 Handle<String>(key)); 4179 Handle<String>(key));
4267 } else if (obj->IsString()) { 4180 } else if (obj->IsString()) {
4268 // Well, there is one exception: Handle [] on strings. 4181 // Well, there is one exception: Handle [] on strings.
4269 uint32_t index; 4182 uint32_t index;
4270 if (key->AsArrayIndex(&index)) { 4183 if (key->AsArrayIndex(&index)) {
4271 String* string = String::cast(obj); 4184 String* string = String::cast(obj);
4272 if (index < static_cast<uint32_t>(string->length())) 4185 if (index < static_cast<uint32_t>(string->length()))
4273 return isolate->heap()->true_value(); 4186 return isolate->heap()->true_value();
4274 } 4187 }
4275 } 4188 }
4276 return isolate->heap()->false_value(); 4189 return isolate->heap()->false_value();
4277 } 4190 }
4278 4191
4279 4192
4280 static MaybeObject* Runtime_HasProperty(RUNTIME_CALLING_CONVENTION) { 4193 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasProperty) {
4281 RUNTIME_GET_ISOLATE;
4282 NoHandleAllocation na; 4194 NoHandleAllocation na;
4283 ASSERT(args.length() == 2); 4195 ASSERT(args.length() == 2);
4284 4196
4285 // Only JS objects can have properties. 4197 // Only JS objects can have properties.
4286 if (args[0]->IsJSObject()) { 4198 if (args[0]->IsJSObject()) {
4287 JSObject* object = JSObject::cast(args[0]); 4199 JSObject* object = JSObject::cast(args[0]);
4288 CONVERT_CHECKED(String, key, args[1]); 4200 CONVERT_CHECKED(String, key, args[1]);
4289 if (object->HasProperty(key)) return isolate->heap()->true_value(); 4201 if (object->HasProperty(key)) return isolate->heap()->true_value();
4290 } 4202 }
4291 return isolate->heap()->false_value(); 4203 return isolate->heap()->false_value();
4292 } 4204 }
4293 4205
4294 4206
4295 static MaybeObject* Runtime_HasElement(RUNTIME_CALLING_CONVENTION) { 4207 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasElement) {
4296 RUNTIME_GET_ISOLATE;
4297 NoHandleAllocation na; 4208 NoHandleAllocation na;
4298 ASSERT(args.length() == 2); 4209 ASSERT(args.length() == 2);
4299 4210
4300 // Only JS objects can have elements. 4211 // Only JS objects can have elements.
4301 if (args[0]->IsJSObject()) { 4212 if (args[0]->IsJSObject()) {
4302 JSObject* object = JSObject::cast(args[0]); 4213 JSObject* object = JSObject::cast(args[0]);
4303 CONVERT_CHECKED(Smi, index_obj, args[1]); 4214 CONVERT_CHECKED(Smi, index_obj, args[1]);
4304 uint32_t index = index_obj->value(); 4215 uint32_t index = index_obj->value();
4305 if (object->HasElement(index)) return isolate->heap()->true_value(); 4216 if (object->HasElement(index)) return isolate->heap()->true_value();
4306 } 4217 }
4307 return isolate->heap()->false_value(); 4218 return isolate->heap()->false_value();
4308 } 4219 }
4309 4220
4310 4221
4311 static MaybeObject* Runtime_IsPropertyEnumerable(RUNTIME_CALLING_CONVENTION) { 4222 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsPropertyEnumerable) {
4312 RUNTIME_GET_ISOLATE;
4313 NoHandleAllocation ha; 4223 NoHandleAllocation ha;
4314 ASSERT(args.length() == 2); 4224 ASSERT(args.length() == 2);
4315 4225
4316 CONVERT_CHECKED(JSObject, object, args[0]); 4226 CONVERT_CHECKED(JSObject, object, args[0]);
4317 CONVERT_CHECKED(String, key, args[1]); 4227 CONVERT_CHECKED(String, key, args[1]);
4318 4228
4319 uint32_t index; 4229 uint32_t index;
4320 if (key->AsArrayIndex(&index)) { 4230 if (key->AsArrayIndex(&index)) {
4321 return isolate->heap()->ToBoolean(object->HasElement(index)); 4231 return isolate->heap()->ToBoolean(object->HasElement(index));
4322 } 4232 }
4323 4233
4324 PropertyAttributes att = object->GetLocalPropertyAttribute(key); 4234 PropertyAttributes att = object->GetLocalPropertyAttribute(key);
4325 return isolate->heap()->ToBoolean(att != ABSENT && (att & DONT_ENUM) == 0); 4235 return isolate->heap()->ToBoolean(att != ABSENT && (att & DONT_ENUM) == 0);
4326 } 4236 }
4327 4237
4328 4238
4329 static MaybeObject* Runtime_GetPropertyNames(RUNTIME_CALLING_CONVENTION) { 4239 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNames) {
4330 RUNTIME_GET_ISOLATE;
4331 HandleScope scope(isolate); 4240 HandleScope scope(isolate);
4332 ASSERT(args.length() == 1); 4241 ASSERT(args.length() == 1);
4333 CONVERT_ARG_CHECKED(JSObject, object, 0); 4242 CONVERT_ARG_CHECKED(JSObject, object, 0);
4334 return *GetKeysFor(object); 4243 return *GetKeysFor(object);
4335 } 4244 }
4336 4245
4337 4246
4338 // Returns either a FixedArray as Runtime_GetPropertyNames, 4247 // Returns either a FixedArray as Runtime_GetPropertyNames,
4339 // or, if the given object has an enum cache that contains 4248 // or, if the given object has an enum cache that contains
4340 // all enumerable properties of the object and its prototypes 4249 // all enumerable properties of the object and its prototypes
4341 // have none, the map of the object. This is used to speed up 4250 // have none, the map of the object. This is used to speed up
4342 // the check for deletions during a for-in. 4251 // the check for deletions during a for-in.
4343 static MaybeObject* Runtime_GetPropertyNamesFast(RUNTIME_CALLING_CONVENTION) { 4252 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNamesFast) {
4344 RUNTIME_GET_ISOLATE;
4345 ASSERT(args.length() == 1); 4253 ASSERT(args.length() == 1);
4346 4254
4347 CONVERT_CHECKED(JSObject, raw_object, args[0]); 4255 CONVERT_CHECKED(JSObject, raw_object, args[0]);
4348 4256
4349 if (raw_object->IsSimpleEnum()) return raw_object->map(); 4257 if (raw_object->IsSimpleEnum()) return raw_object->map();
4350 4258
4351 HandleScope scope(isolate); 4259 HandleScope scope(isolate);
4352 Handle<JSObject> object(raw_object); 4260 Handle<JSObject> object(raw_object);
4353 Handle<FixedArray> content = GetKeysInFixedArrayFor(object, 4261 Handle<FixedArray> content = GetKeysInFixedArrayFor(object,
4354 INCLUDE_PROTOS); 4262 INCLUDE_PROTOS);
(...skipping 15 matching lines...) Expand all
4370 JSObject::cast(proto)->map()->is_hidden_prototype()) { 4278 JSObject::cast(proto)->map()->is_hidden_prototype()) {
4371 count++; 4279 count++;
4372 proto = JSObject::cast(proto)->GetPrototype(); 4280 proto = JSObject::cast(proto)->GetPrototype();
4373 } 4281 }
4374 return count; 4282 return count;
4375 } 4283 }
4376 4284
4377 4285
4378 // Return the names of the local named properties. 4286 // Return the names of the local named properties.
4379 // args[0]: object 4287 // args[0]: object
4380 static MaybeObject* Runtime_GetLocalPropertyNames(RUNTIME_CALLING_CONVENTION) { 4288 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLocalPropertyNames) {
4381 RUNTIME_GET_ISOLATE;
4382 HandleScope scope(isolate); 4289 HandleScope scope(isolate);
4383 ASSERT(args.length() == 1); 4290 ASSERT(args.length() == 1);
4384 if (!args[0]->IsJSObject()) { 4291 if (!args[0]->IsJSObject()) {
4385 return isolate->heap()->undefined_value(); 4292 return isolate->heap()->undefined_value();
4386 } 4293 }
4387 CONVERT_ARG_CHECKED(JSObject, obj, 0); 4294 CONVERT_ARG_CHECKED(JSObject, obj, 0);
4388 4295
4389 // Skip the global proxy as it has no properties and always delegates to the 4296 // Skip the global proxy as it has no properties and always delegates to the
4390 // real global object. 4297 // real global object.
4391 if (obj->IsJSGlobalProxy()) { 4298 if (obj->IsJSGlobalProxy()) {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
4457 names->set(dest_pos++, name); 4364 names->set(dest_pos++, name);
4458 } 4365 }
4459 } 4366 }
4460 4367
4461 return *isolate->factory()->NewJSArrayWithElements(names); 4368 return *isolate->factory()->NewJSArrayWithElements(names);
4462 } 4369 }
4463 4370
4464 4371
4465 // Return the names of the local indexed properties. 4372 // Return the names of the local indexed properties.
4466 // args[0]: object 4373 // args[0]: object
4467 static MaybeObject* Runtime_GetLocalElementNames(RUNTIME_CALLING_CONVENTION) { 4374 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLocalElementNames) {
4468 RUNTIME_GET_ISOLATE;
4469 HandleScope scope(isolate); 4375 HandleScope scope(isolate);
4470 ASSERT(args.length() == 1); 4376 ASSERT(args.length() == 1);
4471 if (!args[0]->IsJSObject()) { 4377 if (!args[0]->IsJSObject()) {
4472 return isolate->heap()->undefined_value(); 4378 return isolate->heap()->undefined_value();
4473 } 4379 }
4474 CONVERT_ARG_CHECKED(JSObject, obj, 0); 4380 CONVERT_ARG_CHECKED(JSObject, obj, 0);
4475 4381
4476 int n = obj->NumberOfLocalElements(static_cast<PropertyAttributes>(NONE)); 4382 int n = obj->NumberOfLocalElements(static_cast<PropertyAttributes>(NONE));
4477 Handle<FixedArray> names = isolate->factory()->NewFixedArray(n); 4383 Handle<FixedArray> names = isolate->factory()->NewFixedArray(n);
4478 obj->GetLocalElementKeys(*names, static_cast<PropertyAttributes>(NONE)); 4384 obj->GetLocalElementKeys(*names, static_cast<PropertyAttributes>(NONE));
4479 return *isolate->factory()->NewJSArrayWithElements(names); 4385 return *isolate->factory()->NewJSArrayWithElements(names);
4480 } 4386 }
4481 4387
4482 4388
4483 // Return information on whether an object has a named or indexed interceptor. 4389 // Return information on whether an object has a named or indexed interceptor.
4484 // args[0]: object 4390 // args[0]: object
4485 static MaybeObject* Runtime_GetInterceptorInfo(RUNTIME_CALLING_CONVENTION) { 4391 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetInterceptorInfo) {
4486 RUNTIME_GET_ISOLATE;
4487 HandleScope scope(isolate); 4392 HandleScope scope(isolate);
4488 ASSERT(args.length() == 1); 4393 ASSERT(args.length() == 1);
4489 if (!args[0]->IsJSObject()) { 4394 if (!args[0]->IsJSObject()) {
4490 return Smi::FromInt(0); 4395 return Smi::FromInt(0);
4491 } 4396 }
4492 CONVERT_ARG_CHECKED(JSObject, obj, 0); 4397 CONVERT_ARG_CHECKED(JSObject, obj, 0);
4493 4398
4494 int result = 0; 4399 int result = 0;
4495 if (obj->HasNamedInterceptor()) result |= 2; 4400 if (obj->HasNamedInterceptor()) result |= 2;
4496 if (obj->HasIndexedInterceptor()) result |= 1; 4401 if (obj->HasIndexedInterceptor()) result |= 1;
4497 4402
4498 return Smi::FromInt(result); 4403 return Smi::FromInt(result);
4499 } 4404 }
4500 4405
4501 4406
4502 // Return property names from named interceptor. 4407 // Return property names from named interceptor.
4503 // args[0]: object 4408 // args[0]: object
4504 static MaybeObject* Runtime_GetNamedInterceptorPropertyNames( 4409 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetNamedInterceptorPropertyNames) {
4505 RUNTIME_CALLING_CONVENTION) {
4506 RUNTIME_GET_ISOLATE;
4507 HandleScope scope(isolate); 4410 HandleScope scope(isolate);
4508 ASSERT(args.length() == 1); 4411 ASSERT(args.length() == 1);
4509 CONVERT_ARG_CHECKED(JSObject, obj, 0); 4412 CONVERT_ARG_CHECKED(JSObject, obj, 0);
4510 4413
4511 if (obj->HasNamedInterceptor()) { 4414 if (obj->HasNamedInterceptor()) {
4512 v8::Handle<v8::Array> result = GetKeysForNamedInterceptor(obj, obj); 4415 v8::Handle<v8::Array> result = GetKeysForNamedInterceptor(obj, obj);
4513 if (!result.IsEmpty()) return *v8::Utils::OpenHandle(*result); 4416 if (!result.IsEmpty()) return *v8::Utils::OpenHandle(*result);
4514 } 4417 }
4515 return isolate->heap()->undefined_value(); 4418 return isolate->heap()->undefined_value();
4516 } 4419 }
4517 4420
4518 4421
4519 // Return element names from indexed interceptor. 4422 // Return element names from indexed interceptor.
4520 // args[0]: object 4423 // args[0]: object
4521 static MaybeObject* Runtime_GetIndexedInterceptorElementNames( 4424 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetIndexedInterceptorElementNames) {
4522 RUNTIME_CALLING_CONVENTION) {
4523 RUNTIME_GET_ISOLATE;
4524 HandleScope scope(isolate); 4425 HandleScope scope(isolate);
4525 ASSERT(args.length() == 1); 4426 ASSERT(args.length() == 1);
4526 CONVERT_ARG_CHECKED(JSObject, obj, 0); 4427 CONVERT_ARG_CHECKED(JSObject, obj, 0);
4527 4428
4528 if (obj->HasIndexedInterceptor()) { 4429 if (obj->HasIndexedInterceptor()) {
4529 v8::Handle<v8::Array> result = GetKeysForIndexedInterceptor(obj, obj); 4430 v8::Handle<v8::Array> result = GetKeysForIndexedInterceptor(obj, obj);
4530 if (!result.IsEmpty()) return *v8::Utils::OpenHandle(*result); 4431 if (!result.IsEmpty()) return *v8::Utils::OpenHandle(*result);
4531 } 4432 }
4532 return isolate->heap()->undefined_value(); 4433 return isolate->heap()->undefined_value();
4533 } 4434 }
4534 4435
4535 4436
4536 static MaybeObject* Runtime_LocalKeys(RUNTIME_CALLING_CONVENTION) { 4437 RUNTIME_FUNCTION(MaybeObject*, Runtime_LocalKeys) {
4537 RUNTIME_GET_ISOLATE;
4538 ASSERT_EQ(args.length(), 1); 4438 ASSERT_EQ(args.length(), 1);
4539 CONVERT_CHECKED(JSObject, raw_object, args[0]); 4439 CONVERT_CHECKED(JSObject, raw_object, args[0]);
4540 HandleScope scope(isolate); 4440 HandleScope scope(isolate);
4541 Handle<JSObject> object(raw_object); 4441 Handle<JSObject> object(raw_object);
4542 4442
4543 if (object->IsJSGlobalProxy()) { 4443 if (object->IsJSGlobalProxy()) {
4544 // Do access checks before going to the global object. 4444 // Do access checks before going to the global object.
4545 if (object->IsAccessCheckNeeded() && 4445 if (object->IsAccessCheckNeeded() &&
4546 !isolate->MayNamedAccess(*object, isolate->heap()->undefined_value(), 4446 !isolate->MayNamedAccess(*object, isolate->heap()->undefined_value(),
4547 v8::ACCESS_KEYS)) { 4447 v8::ACCESS_KEYS)) {
(...skipping 24 matching lines...) Expand all
4572 Handle<Object> entry_handle(entry, isolate); 4472 Handle<Object> entry_handle(entry, isolate);
4573 Handle<Object> entry_str = 4473 Handle<Object> entry_str =
4574 isolate->factory()->NumberToString(entry_handle); 4474 isolate->factory()->NumberToString(entry_handle);
4575 copy->set(i, *entry_str); 4475 copy->set(i, *entry_str);
4576 } 4476 }
4577 } 4477 }
4578 return *isolate->factory()->NewJSArrayWithElements(copy); 4478 return *isolate->factory()->NewJSArrayWithElements(copy);
4579 } 4479 }
4580 4480
4581 4481
4582 static MaybeObject* Runtime_GetArgumentsProperty(RUNTIME_CALLING_CONVENTION) { 4482 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetArgumentsProperty) {
4583 RUNTIME_GET_ISOLATE;
4584 NoHandleAllocation ha; 4483 NoHandleAllocation ha;
4585 ASSERT(args.length() == 1); 4484 ASSERT(args.length() == 1);
4586 4485
4587 // Compute the frame holding the arguments. 4486 // Compute the frame holding the arguments.
4588 JavaScriptFrameIterator it; 4487 JavaScriptFrameIterator it;
4589 it.AdvanceToArgumentsFrame(); 4488 it.AdvanceToArgumentsFrame();
4590 JavaScriptFrame* frame = it.frame(); 4489 JavaScriptFrame* frame = it.frame();
4591 4490
4592 // Get the actual number of provided arguments. 4491 // Get the actual number of provided arguments.
4593 const uint32_t n = frame->ComputeParametersCount(); 4492 const uint32_t n = frame->ComputeParametersCount();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4626 "strict_arguments_callee", HandleVector<Object>(NULL, 0))); 4525 "strict_arguments_callee", HandleVector<Object>(NULL, 0)));
4627 } 4526 }
4628 return function; 4527 return function;
4629 } 4528 }
4630 4529
4631 // Lookup in the initial Object.prototype object. 4530 // Lookup in the initial Object.prototype object.
4632 return isolate->initial_object_prototype()->GetProperty(*key); 4531 return isolate->initial_object_prototype()->GetProperty(*key);
4633 } 4532 }
4634 4533
4635 4534
4636 static MaybeObject* Runtime_ToFastProperties(RUNTIME_CALLING_CONVENTION) { 4535 RUNTIME_FUNCTION(MaybeObject*, Runtime_ToFastProperties) {
4637 RUNTIME_GET_ISOLATE;
4638 HandleScope scope(isolate); 4536 HandleScope scope(isolate);
4639 4537
4640 ASSERT(args.length() == 1); 4538 ASSERT(args.length() == 1);
4641 Handle<Object> object = args.at<Object>(0); 4539 Handle<Object> object = args.at<Object>(0);
4642 if (object->IsJSObject()) { 4540 if (object->IsJSObject()) {
4643 Handle<JSObject> js_object = Handle<JSObject>::cast(object); 4541 Handle<JSObject> js_object = Handle<JSObject>::cast(object);
4644 if (!js_object->HasFastProperties() && !js_object->IsGlobalObject()) { 4542 if (!js_object->HasFastProperties() && !js_object->IsGlobalObject()) {
4645 MaybeObject* ok = js_object->TransformToFastProperties(0); 4543 MaybeObject* ok = js_object->TransformToFastProperties(0);
4646 if (ok->IsRetryAfterGC()) return ok; 4544 if (ok->IsRetryAfterGC()) return ok;
4647 } 4545 }
4648 } 4546 }
4649 return *object; 4547 return *object;
4650 } 4548 }
4651 4549
4652 4550
4653 static MaybeObject* Runtime_ToSlowProperties(RUNTIME_CALLING_CONVENTION) { 4551 RUNTIME_FUNCTION(MaybeObject*, Runtime_ToSlowProperties) {
4654 RUNTIME_GET_ISOLATE;
4655 HandleScope scope(isolate); 4552 HandleScope scope(isolate);
4656 4553
4657 ASSERT(args.length() == 1); 4554 ASSERT(args.length() == 1);
4658 Handle<Object> object = args.at<Object>(0); 4555 Handle<Object> object = args.at<Object>(0);
4659 if (object->IsJSObject() && !object->IsJSGlobalProxy()) { 4556 if (object->IsJSObject() && !object->IsJSGlobalProxy()) {
4660 Handle<JSObject> js_object = Handle<JSObject>::cast(object); 4557 Handle<JSObject> js_object = Handle<JSObject>::cast(object);
4661 NormalizeProperties(js_object, CLEAR_INOBJECT_PROPERTIES, 0); 4558 NormalizeProperties(js_object, CLEAR_INOBJECT_PROPERTIES, 0);
4662 } 4559 }
4663 return *object; 4560 return *object;
4664 } 4561 }
4665 4562
4666 4563
4667 static MaybeObject* Runtime_ToBool(RUNTIME_CALLING_CONVENTION) { 4564 RUNTIME_FUNCTION(MaybeObject*, Runtime_ToBool) {
4668 RUNTIME_GET_ISOLATE;
4669 NoHandleAllocation ha; 4565 NoHandleAllocation ha;
4670 ASSERT(args.length() == 1); 4566 ASSERT(args.length() == 1);
4671 4567
4672 return args[0]->ToBoolean(); 4568 return args[0]->ToBoolean();
4673 } 4569 }
4674 4570
4675 4571
4676 // Returns the type string of a value; see ECMA-262, 11.4.3 (p 47). 4572 // Returns the type string of a value; see ECMA-262, 11.4.3 (p 47).
4677 // Possible optimizations: put the type string into the oddballs. 4573 // Possible optimizations: put the type string into the oddballs.
4678 static MaybeObject* Runtime_Typeof(RUNTIME_CALLING_CONVENTION) { 4574 RUNTIME_FUNCTION(MaybeObject*, Runtime_Typeof) {
4679 RUNTIME_GET_ISOLATE;
4680 NoHandleAllocation ha; 4575 NoHandleAllocation ha;
4681 4576
4682 Object* obj = args[0]; 4577 Object* obj = args[0];
4683 if (obj->IsNumber()) return isolate->heap()->number_symbol(); 4578 if (obj->IsNumber()) return isolate->heap()->number_symbol();
4684 HeapObject* heap_obj = HeapObject::cast(obj); 4579 HeapObject* heap_obj = HeapObject::cast(obj);
4685 4580
4686 // typeof an undetectable object is 'undefined' 4581 // typeof an undetectable object is 'undefined'
4687 if (heap_obj->map()->is_undetectable()) { 4582 if (heap_obj->map()->is_undetectable()) {
4688 return isolate->heap()->undefined_symbol(); 4583 return isolate->heap()->undefined_symbol();
4689 } 4584 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
4728 int d = s[from] - '0'; 4623 int d = s[from] - '0';
4729 4624
4730 for (int i = from + 1; i < to; i++) { 4625 for (int i = from + 1; i < to; i++) {
4731 d = 10 * d + (s[i] - '0'); 4626 d = 10 * d + (s[i] - '0');
4732 } 4627 }
4733 4628
4734 return d; 4629 return d;
4735 } 4630 }
4736 4631
4737 4632
4738 static MaybeObject* Runtime_StringToNumber(RUNTIME_CALLING_CONVENTION) { 4633 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringToNumber) {
4739 RUNTIME_GET_ISOLATE;
4740 NoHandleAllocation ha; 4634 NoHandleAllocation ha;
4741 ASSERT(args.length() == 1); 4635 ASSERT(args.length() == 1);
4742 CONVERT_CHECKED(String, subject, args[0]); 4636 CONVERT_CHECKED(String, subject, args[0]);
4743 subject->TryFlatten(); 4637 subject->TryFlatten();
4744 4638
4745 // Fast case: short integer or some sorts of junk values. 4639 // Fast case: short integer or some sorts of junk values.
4746 int len = subject->length(); 4640 int len = subject->length();
4747 if (subject->IsSeqAsciiString()) { 4641 if (subject->IsSeqAsciiString()) {
4748 if (len == 0) return Smi::FromInt(0); 4642 if (len == 0) return Smi::FromInt(0);
4749 4643
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
4783 } 4677 }
4784 return Smi::FromInt(d); 4678 return Smi::FromInt(d);
4785 } 4679 }
4786 } 4680 }
4787 4681
4788 // Slower case. 4682 // Slower case.
4789 return isolate->heap()->NumberFromDouble(StringToDouble(subject, ALLOW_HEX)); 4683 return isolate->heap()->NumberFromDouble(StringToDouble(subject, ALLOW_HEX));
4790 } 4684 }
4791 4685
4792 4686
4793 static MaybeObject* Runtime_StringFromCharCodeArray( 4687 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringFromCharCodeArray) {
4794 RUNTIME_CALLING_CONVENTION) {
4795 RUNTIME_GET_ISOLATE;
4796 NoHandleAllocation ha; 4688 NoHandleAllocation ha;
4797 ASSERT(args.length() == 1); 4689 ASSERT(args.length() == 1);
4798 4690
4799 CONVERT_CHECKED(JSArray, codes, args[0]); 4691 CONVERT_CHECKED(JSArray, codes, args[0]);
4800 int length = Smi::cast(codes->length())->value(); 4692 int length = Smi::cast(codes->length())->value();
4801 4693
4802 // Check if the string can be ASCII. 4694 // Check if the string can be ASCII.
4803 int i; 4695 int i;
4804 for (i = 0; i < length; i++) { 4696 for (i = 0; i < length; i++) {
4805 Object* element; 4697 Object* element;
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
4865 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4757 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4866 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4758 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4867 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4759 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4868 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4760 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4869 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4761 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4870 }; 4762 };
4871 return kNotEscaped[character] != 0; 4763 return kNotEscaped[character] != 0;
4872 } 4764 }
4873 4765
4874 4766
4875 static MaybeObject* Runtime_URIEscape(RUNTIME_CALLING_CONVENTION) { 4767 RUNTIME_FUNCTION(MaybeObject*, Runtime_URIEscape) {
4876 RUNTIME_GET_ISOLATE;
4877 const char hex_chars[] = "0123456789ABCDEF"; 4768 const char hex_chars[] = "0123456789ABCDEF";
4878 NoHandleAllocation ha; 4769 NoHandleAllocation ha;
4879 ASSERT(args.length() == 1); 4770 ASSERT(args.length() == 1);
4880 CONVERT_CHECKED(String, source, args[0]); 4771 CONVERT_CHECKED(String, source, args[0]);
4881 4772
4882 source->TryFlatten(); 4773 source->TryFlatten();
4883 4774
4884 int escaped_length = 0; 4775 int escaped_length = 0;
4885 int length = source->length(); 4776 int length = source->length();
4886 { 4777 {
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
4985 source->Get(i + 2))) != -1) { 4876 source->Get(i + 2))) != -1) {
4986 *step = 3; 4877 *step = 3;
4987 return lo; 4878 return lo;
4988 } else { 4879 } else {
4989 *step = 1; 4880 *step = 1;
4990 return character; 4881 return character;
4991 } 4882 }
4992 } 4883 }
4993 4884
4994 4885
4995 static MaybeObject* Runtime_URIUnescape(RUNTIME_CALLING_CONVENTION) { 4886 RUNTIME_FUNCTION(MaybeObject*, Runtime_URIUnescape) {
4996 RUNTIME_GET_ISOLATE;
4997 NoHandleAllocation ha; 4887 NoHandleAllocation ha;
4998 ASSERT(args.length() == 1); 4888 ASSERT(args.length() == 1);
4999 CONVERT_CHECKED(String, source, args[0]); 4889 CONVERT_CHECKED(String, source, args[0]);
5000 4890
5001 source->TryFlatten(); 4891 source->TryFlatten();
5002 4892
5003 bool ascii = true; 4893 bool ascii = true;
5004 int length = source->length(); 4894 int length = source->length();
5005 4895
5006 int unescaped_length = 0; 4896 int unescaped_length = 0;
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
5230 int final_length = static_cast<int>( 5120 int final_length = static_cast<int>(
5231 write_cursor - reinterpret_cast<Char*>( 5121 write_cursor - reinterpret_cast<Char*>(
5232 new_string->address() + SeqAsciiString::kHeaderSize)); 5122 new_string->address() + SeqAsciiString::kHeaderSize));
5233 isolate->heap()->new_space()-> 5123 isolate->heap()->new_space()->
5234 template ShrinkStringAtAllocationBoundary<StringType>( 5124 template ShrinkStringAtAllocationBoundary<StringType>(
5235 new_string, final_length); 5125 new_string, final_length);
5236 return new_string; 5126 return new_string;
5237 } 5127 }
5238 5128
5239 5129
5240 static MaybeObject* Runtime_QuoteJSONString(RUNTIME_CALLING_CONVENTION) { 5130 RUNTIME_FUNCTION(MaybeObject*, Runtime_QuoteJSONString) {
5241 RUNTIME_GET_ISOLATE;
5242 NoHandleAllocation ha; 5131 NoHandleAllocation ha;
5243 CONVERT_CHECKED(String, str, args[0]); 5132 CONVERT_CHECKED(String, str, args[0]);
5244 if (!str->IsFlat()) { 5133 if (!str->IsFlat()) {
5245 MaybeObject* try_flatten = str->TryFlatten(); 5134 MaybeObject* try_flatten = str->TryFlatten();
5246 Object* flat; 5135 Object* flat;
5247 if (!try_flatten->ToObject(&flat)) { 5136 if (!try_flatten->ToObject(&flat)) {
5248 return try_flatten; 5137 return try_flatten;
5249 } 5138 }
5250 str = String::cast(flat); 5139 str = String::cast(flat);
5251 ASSERT(str->IsFlat()); 5140 ASSERT(str->IsFlat());
5252 } 5141 }
5253 if (str->IsTwoByteRepresentation()) { 5142 if (str->IsTwoByteRepresentation()) {
5254 return QuoteJsonString<uc16, SeqTwoByteString, false>(isolate, 5143 return QuoteJsonString<uc16, SeqTwoByteString, false>(isolate,
5255 str->ToUC16Vector()); 5144 str->ToUC16Vector());
5256 } else { 5145 } else {
5257 return QuoteJsonString<char, SeqAsciiString, false>(isolate, 5146 return QuoteJsonString<char, SeqAsciiString, false>(isolate,
5258 str->ToAsciiVector()); 5147 str->ToAsciiVector());
5259 } 5148 }
5260 } 5149 }
5261 5150
5262 5151
5263 static MaybeObject* Runtime_QuoteJSONStringComma(RUNTIME_CALLING_CONVENTION) { 5152 RUNTIME_FUNCTION(MaybeObject*, Runtime_QuoteJSONStringComma) {
5264 RUNTIME_GET_ISOLATE;
5265 NoHandleAllocation ha; 5153 NoHandleAllocation ha;
5266 CONVERT_CHECKED(String, str, args[0]); 5154 CONVERT_CHECKED(String, str, args[0]);
5267 if (!str->IsFlat()) { 5155 if (!str->IsFlat()) {
5268 MaybeObject* try_flatten = str->TryFlatten(); 5156 MaybeObject* try_flatten = str->TryFlatten();
5269 Object* flat; 5157 Object* flat;
5270 if (!try_flatten->ToObject(&flat)) { 5158 if (!try_flatten->ToObject(&flat)) {
5271 return try_flatten; 5159 return try_flatten;
5272 } 5160 }
5273 str = String::cast(flat); 5161 str = String::cast(flat);
5274 ASSERT(str->IsFlat()); 5162 ASSERT(str->IsFlat());
5275 } 5163 }
5276 if (str->IsTwoByteRepresentation()) { 5164 if (str->IsTwoByteRepresentation()) {
5277 return QuoteJsonString<uc16, SeqTwoByteString, true>(isolate, 5165 return QuoteJsonString<uc16, SeqTwoByteString, true>(isolate,
5278 str->ToUC16Vector()); 5166 str->ToUC16Vector());
5279 } else { 5167 } else {
5280 return QuoteJsonString<char, SeqAsciiString, true>(isolate, 5168 return QuoteJsonString<char, SeqAsciiString, true>(isolate,
5281 str->ToAsciiVector()); 5169 str->ToAsciiVector());
5282 } 5170 }
5283 } 5171 }
5284 5172
5285 static MaybeObject* Runtime_StringParseInt(RUNTIME_CALLING_CONVENTION) { 5173 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringParseInt) {
5286 RUNTIME_GET_ISOLATE;
5287 NoHandleAllocation ha; 5174 NoHandleAllocation ha;
5288 5175
5289 CONVERT_CHECKED(String, s, args[0]); 5176 CONVERT_CHECKED(String, s, args[0]);
5290 CONVERT_SMI_CHECKED(radix, args[1]); 5177 CONVERT_SMI_CHECKED(radix, args[1]);
5291 5178
5292 s->TryFlatten(); 5179 s->TryFlatten();
5293 5180
5294 RUNTIME_ASSERT(radix == 0 || (2 <= radix && radix <= 36)); 5181 RUNTIME_ASSERT(radix == 0 || (2 <= radix && radix <= 36));
5295 double value = StringToInt(s, radix); 5182 double value = StringToInt(s, radix);
5296 return isolate->heap()->NumberFromDouble(value); 5183 return isolate->heap()->NumberFromDouble(value);
5297 } 5184 }
5298 5185
5299 5186
5300 static MaybeObject* Runtime_StringParseFloat(RUNTIME_CALLING_CONVENTION) { 5187 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringParseFloat) {
5301 RUNTIME_GET_ISOLATE;
5302 NoHandleAllocation ha; 5188 NoHandleAllocation ha;
5303 CONVERT_CHECKED(String, str, args[0]); 5189 CONVERT_CHECKED(String, str, args[0]);
5304 5190
5305 // ECMA-262 section 15.1.2.3, empty string is NaN 5191 // ECMA-262 section 15.1.2.3, empty string is NaN
5306 double value = StringToDouble(str, ALLOW_TRAILING_JUNK, OS::nan_value()); 5192 double value = StringToDouble(str, ALLOW_TRAILING_JUNK, OS::nan_value());
5307 5193
5308 // Create a number object from the value. 5194 // Create a number object from the value.
5309 return isolate->heap()->NumberFromDouble(value); 5195 return isolate->heap()->NumberFromDouble(value);
5310 } 5196 }
5311 5197
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
5582 { MaybeObject* maybe_answer = 5468 { MaybeObject* maybe_answer =
5583 ConvertCaseHelper(isolate, 5469 ConvertCaseHelper(isolate,
5584 s, Smi::cast(answer)->value(), length, mapping); 5470 s, Smi::cast(answer)->value(), length, mapping);
5585 if (!maybe_answer->ToObject(&answer)) return maybe_answer; 5471 if (!maybe_answer->ToObject(&answer)) return maybe_answer;
5586 } 5472 }
5587 } 5473 }
5588 return answer; 5474 return answer;
5589 } 5475 }
5590 5476
5591 5477
5592 static MaybeObject* Runtime_StringToLowerCase(RUNTIME_CALLING_CONVENTION) { 5478 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringToLowerCase) {
5593 RUNTIME_GET_ISOLATE;
5594 return ConvertCase<ToLowerTraits>( 5479 return ConvertCase<ToLowerTraits>(
5595 args, isolate, isolate->runtime_state()->to_lower_mapping()); 5480 args, isolate, isolate->runtime_state()->to_lower_mapping());
5596 } 5481 }
5597 5482
5598 5483
5599 static MaybeObject* Runtime_StringToUpperCase(RUNTIME_CALLING_CONVENTION) { 5484 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringToUpperCase) {
5600 RUNTIME_GET_ISOLATE;
5601 return ConvertCase<ToUpperTraits>( 5485 return ConvertCase<ToUpperTraits>(
5602 args, isolate, isolate->runtime_state()->to_upper_mapping()); 5486 args, isolate, isolate->runtime_state()->to_upper_mapping());
5603 } 5487 }
5604 5488
5605 5489
5606 static inline bool IsTrimWhiteSpace(unibrow::uchar c) { 5490 static inline bool IsTrimWhiteSpace(unibrow::uchar c) {
5607 return unibrow::WhiteSpace::Is(c) || c == 0x200b; 5491 return unibrow::WhiteSpace::Is(c) || c == 0x200b;
5608 } 5492 }
5609 5493
5610 5494
5611 static MaybeObject* Runtime_StringTrim(RUNTIME_CALLING_CONVENTION) { 5495 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringTrim) {
5612 RUNTIME_GET_ISOLATE;
5613 NoHandleAllocation ha; 5496 NoHandleAllocation ha;
5614 ASSERT(args.length() == 3); 5497 ASSERT(args.length() == 3);
5615 5498
5616 CONVERT_CHECKED(String, s, args[0]); 5499 CONVERT_CHECKED(String, s, args[0]);
5617 CONVERT_BOOLEAN_CHECKED(trimLeft, args[1]); 5500 CONVERT_BOOLEAN_CHECKED(trimLeft, args[1]);
5618 CONVERT_BOOLEAN_CHECKED(trimRight, args[2]); 5501 CONVERT_BOOLEAN_CHECKED(trimRight, args[2]);
5619 5502
5620 s->TryFlatten(); 5503 s->TryFlatten();
5621 int length = s->length(); 5504 int length = s->length();
5622 5505
(...skipping 29 matching lines...) Expand all
5652 while (limit > 0) { 5535 while (limit > 0) {
5653 index = search.Search(subject, index); 5536 index = search.Search(subject, index);
5654 if (index < 0) return; 5537 if (index < 0) return;
5655 indices->Add(index); 5538 indices->Add(index);
5656 index += pattern_length; 5539 index += pattern_length;
5657 limit--; 5540 limit--;
5658 } 5541 }
5659 } 5542 }
5660 5543
5661 5544
5662 static MaybeObject* Runtime_StringSplit(RUNTIME_CALLING_CONVENTION) { 5545 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringSplit) {
5663 RUNTIME_GET_ISOLATE;
5664 ASSERT(args.length() == 3); 5546 ASSERT(args.length() == 3);
5665 HandleScope handle_scope(isolate); 5547 HandleScope handle_scope(isolate);
5666 CONVERT_ARG_CHECKED(String, subject, 0); 5548 CONVERT_ARG_CHECKED(String, subject, 0);
5667 CONVERT_ARG_CHECKED(String, pattern, 1); 5549 CONVERT_ARG_CHECKED(String, pattern, 1);
5668 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[2]); 5550 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[2]);
5669 5551
5670 int subject_length = subject->length(); 5552 int subject_length = subject->length();
5671 int pattern_length = pattern->length(); 5553 int pattern_length = pattern->length();
5672 RUNTIME_ASSERT(pattern_length > 0); 5554 RUNTIME_ASSERT(pattern_length > 0);
5673 5555
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
5784 ASSERT(element == Smi::FromInt(0) || 5666 ASSERT(element == Smi::FromInt(0) ||
5785 (element->IsString() && String::cast(element)->LooksValid())); 5667 (element->IsString() && String::cast(element)->LooksValid()));
5786 } 5668 }
5787 #endif 5669 #endif
5788 return i; 5670 return i;
5789 } 5671 }
5790 5672
5791 5673
5792 // Converts a String to JSArray. 5674 // Converts a String to JSArray.
5793 // For example, "foo" => ["f", "o", "o"]. 5675 // For example, "foo" => ["f", "o", "o"].
5794 static MaybeObject* Runtime_StringToArray(RUNTIME_CALLING_CONVENTION) { 5676 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringToArray) {
5795 RUNTIME_GET_ISOLATE;
5796 HandleScope scope(isolate); 5677 HandleScope scope(isolate);
5797 ASSERT(args.length() == 2); 5678 ASSERT(args.length() == 2);
5798 CONVERT_ARG_CHECKED(String, s, 0); 5679 CONVERT_ARG_CHECKED(String, s, 0);
5799 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]); 5680 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]);
5800 5681
5801 s->TryFlatten(); 5682 s->TryFlatten();
5802 const int length = static_cast<int>(Min<uint32_t>(s->length(), limit)); 5683 const int length = static_cast<int>(Min<uint32_t>(s->length(), limit));
5803 5684
5804 Handle<FixedArray> elements; 5685 Handle<FixedArray> elements;
5805 if (s->IsFlat() && s->IsAsciiRepresentation()) { 5686 if (s->IsFlat() && s->IsAsciiRepresentation()) {
(...skipping 27 matching lines...) Expand all
5833 #ifdef DEBUG 5714 #ifdef DEBUG
5834 for (int i = 0; i < length; ++i) { 5715 for (int i = 0; i < length; ++i) {
5835 ASSERT(String::cast(elements->get(i))->length() == 1); 5716 ASSERT(String::cast(elements->get(i))->length() == 1);
5836 } 5717 }
5837 #endif 5718 #endif
5838 5719
5839 return *isolate->factory()->NewJSArrayWithElements(elements); 5720 return *isolate->factory()->NewJSArrayWithElements(elements);
5840 } 5721 }
5841 5722
5842 5723
5843 static MaybeObject* Runtime_NewStringWrapper(RUNTIME_CALLING_CONVENTION) { 5724 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewStringWrapper) {
5844 RUNTIME_GET_ISOLATE;
5845 NoHandleAllocation ha; 5725 NoHandleAllocation ha;
5846 ASSERT(args.length() == 1); 5726 ASSERT(args.length() == 1);
5847 CONVERT_CHECKED(String, value, args[0]); 5727 CONVERT_CHECKED(String, value, args[0]);
5848 return value->ToObject(); 5728 return value->ToObject();
5849 } 5729 }
5850 5730
5851 5731
5852 bool Runtime::IsUpperCaseChar(RuntimeState* runtime_state, uint16_t ch) { 5732 bool Runtime::IsUpperCaseChar(RuntimeState* runtime_state, uint16_t ch) {
5853 unibrow::uchar chars[unibrow::ToUppercase::kMaxWidth]; 5733 unibrow::uchar chars[unibrow::ToUppercase::kMaxWidth];
5854 int char_length = runtime_state->to_upper_mapping()->get(ch, 0, chars); 5734 int char_length = runtime_state->to_upper_mapping()->get(ch, 0, chars);
5855 return char_length == 0; 5735 return char_length == 0;
5856 } 5736 }
5857 5737
5858 5738
5859 static MaybeObject* Runtime_NumberToString(RUNTIME_CALLING_CONVENTION) { 5739 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToString) {
5860 RUNTIME_GET_ISOLATE;
5861 NoHandleAllocation ha; 5740 NoHandleAllocation ha;
5862 ASSERT(args.length() == 1); 5741 ASSERT(args.length() == 1);
5863 5742
5864 Object* number = args[0]; 5743 Object* number = args[0];
5865 RUNTIME_ASSERT(number->IsNumber()); 5744 RUNTIME_ASSERT(number->IsNumber());
5866 5745
5867 return isolate->heap()->NumberToString(number); 5746 return isolate->heap()->NumberToString(number);
5868 } 5747 }
5869 5748
5870 5749
5871 static MaybeObject* Runtime_NumberToStringSkipCache( 5750 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToStringSkipCache) {
5872 RUNTIME_CALLING_CONVENTION) {
5873 RUNTIME_GET_ISOLATE;
5874 NoHandleAllocation ha; 5751 NoHandleAllocation ha;
5875 ASSERT(args.length() == 1); 5752 ASSERT(args.length() == 1);
5876 5753
5877 Object* number = args[0]; 5754 Object* number = args[0];
5878 RUNTIME_ASSERT(number->IsNumber()); 5755 RUNTIME_ASSERT(number->IsNumber());
5879 5756
5880 return isolate->heap()->NumberToString(number, false); 5757 return isolate->heap()->NumberToString(number, false);
5881 } 5758 }
5882 5759
5883 5760
5884 static MaybeObject* Runtime_NumberToInteger(RUNTIME_CALLING_CONVENTION) { 5761 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToInteger) {
5885 RUNTIME_GET_ISOLATE;
5886 NoHandleAllocation ha; 5762 NoHandleAllocation ha;
5887 ASSERT(args.length() == 1); 5763 ASSERT(args.length() == 1);
5888 5764
5889 CONVERT_DOUBLE_CHECKED(number, args[0]); 5765 CONVERT_DOUBLE_CHECKED(number, args[0]);
5890 5766
5891 // We do not include 0 so that we don't have to treat +0 / -0 cases. 5767 // We do not include 0 so that we don't have to treat +0 / -0 cases.
5892 if (number > 0 && number <= Smi::kMaxValue) { 5768 if (number > 0 && number <= Smi::kMaxValue) {
5893 return Smi::FromInt(static_cast<int>(number)); 5769 return Smi::FromInt(static_cast<int>(number));
5894 } 5770 }
5895 return isolate->heap()->NumberFromDouble(DoubleToInteger(number)); 5771 return isolate->heap()->NumberFromDouble(DoubleToInteger(number));
5896 } 5772 }
5897 5773
5898 5774
5899 static MaybeObject* Runtime_NumberToIntegerMapMinusZero( 5775 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToIntegerMapMinusZero) {
5900 RUNTIME_CALLING_CONVENTION) {
5901 RUNTIME_GET_ISOLATE;
5902 NoHandleAllocation ha; 5776 NoHandleAllocation ha;
5903 ASSERT(args.length() == 1); 5777 ASSERT(args.length() == 1);
5904 5778
5905 CONVERT_DOUBLE_CHECKED(number, args[0]); 5779 CONVERT_DOUBLE_CHECKED(number, args[0]);
5906 5780
5907 // We do not include 0 so that we don't have to treat +0 / -0 cases. 5781 // We do not include 0 so that we don't have to treat +0 / -0 cases.
5908 if (number > 0 && number <= Smi::kMaxValue) { 5782 if (number > 0 && number <= Smi::kMaxValue) {
5909 return Smi::FromInt(static_cast<int>(number)); 5783 return Smi::FromInt(static_cast<int>(number));
5910 } 5784 }
5911 5785
5912 double double_value = DoubleToInteger(number); 5786 double double_value = DoubleToInteger(number);
5913 // Map both -0 and +0 to +0. 5787 // Map both -0 and +0 to +0.
5914 if (double_value == 0) double_value = 0; 5788 if (double_value == 0) double_value = 0;
5915 5789
5916 return isolate->heap()->NumberFromDouble(double_value); 5790 return isolate->heap()->NumberFromDouble(double_value);
5917 } 5791 }
5918 5792
5919 5793
5920 static MaybeObject* Runtime_NumberToJSUint32(RUNTIME_CALLING_CONVENTION) { 5794 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToJSUint32) {
5921 RUNTIME_GET_ISOLATE;
5922 NoHandleAllocation ha; 5795 NoHandleAllocation ha;
5923 ASSERT(args.length() == 1); 5796 ASSERT(args.length() == 1);
5924 5797
5925 CONVERT_NUMBER_CHECKED(int32_t, number, Uint32, args[0]); 5798 CONVERT_NUMBER_CHECKED(int32_t, number, Uint32, args[0]);
5926 return isolate->heap()->NumberFromUint32(number); 5799 return isolate->heap()->NumberFromUint32(number);
5927 } 5800 }
5928 5801
5929 5802
5930 static MaybeObject* Runtime_NumberToJSInt32(RUNTIME_CALLING_CONVENTION) { 5803 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToJSInt32) {
5931 RUNTIME_GET_ISOLATE;
5932 NoHandleAllocation ha; 5804 NoHandleAllocation ha;
5933 ASSERT(args.length() == 1); 5805 ASSERT(args.length() == 1);
5934 5806
5935 CONVERT_DOUBLE_CHECKED(number, args[0]); 5807 CONVERT_DOUBLE_CHECKED(number, args[0]);
5936 5808
5937 // We do not include 0 so that we don't have to treat +0 / -0 cases. 5809 // We do not include 0 so that we don't have to treat +0 / -0 cases.
5938 if (number > 0 && number <= Smi::kMaxValue) { 5810 if (number > 0 && number <= Smi::kMaxValue) {
5939 return Smi::FromInt(static_cast<int>(number)); 5811 return Smi::FromInt(static_cast<int>(number));
5940 } 5812 }
5941 return isolate->heap()->NumberFromInt32(DoubleToInt32(number)); 5813 return isolate->heap()->NumberFromInt32(DoubleToInt32(number));
5942 } 5814 }
5943 5815
5944 5816
5945 // Converts a Number to a Smi, if possible. Returns NaN if the number is not 5817 // Converts a Number to a Smi, if possible. Returns NaN if the number is not
5946 // a small integer. 5818 // a small integer.
5947 static MaybeObject* Runtime_NumberToSmi(RUNTIME_CALLING_CONVENTION) { 5819 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToSmi) {
5948 RUNTIME_GET_ISOLATE;
5949 NoHandleAllocation ha; 5820 NoHandleAllocation ha;
5950 ASSERT(args.length() == 1); 5821 ASSERT(args.length() == 1);
5951 5822
5952 Object* obj = args[0]; 5823 Object* obj = args[0];
5953 if (obj->IsSmi()) { 5824 if (obj->IsSmi()) {
5954 return obj; 5825 return obj;
5955 } 5826 }
5956 if (obj->IsHeapNumber()) { 5827 if (obj->IsHeapNumber()) {
5957 double value = HeapNumber::cast(obj)->value(); 5828 double value = HeapNumber::cast(obj)->value();
5958 int int_value = FastD2I(value); 5829 int int_value = FastD2I(value);
5959 if (value == FastI2D(int_value) && Smi::IsValid(int_value)) { 5830 if (value == FastI2D(int_value) && Smi::IsValid(int_value)) {
5960 return Smi::FromInt(int_value); 5831 return Smi::FromInt(int_value);
5961 } 5832 }
5962 } 5833 }
5963 return isolate->heap()->nan_value(); 5834 return isolate->heap()->nan_value();
5964 } 5835 }
5965 5836
5966 5837
5967 static MaybeObject* Runtime_AllocateHeapNumber(RUNTIME_CALLING_CONVENTION) { 5838 RUNTIME_FUNCTION(MaybeObject*, Runtime_AllocateHeapNumber) {
5968 RUNTIME_GET_ISOLATE;
5969 NoHandleAllocation ha; 5839 NoHandleAllocation ha;
5970 ASSERT(args.length() == 0); 5840 ASSERT(args.length() == 0);
5971 return isolate->heap()->AllocateHeapNumber(0); 5841 return isolate->heap()->AllocateHeapNumber(0);
5972 } 5842 }
5973 5843
5974 5844
5975 static MaybeObject* Runtime_NumberAdd(RUNTIME_CALLING_CONVENTION) { 5845 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberAdd) {
5976 RUNTIME_GET_ISOLATE;
5977 NoHandleAllocation ha; 5846 NoHandleAllocation ha;
5978 ASSERT(args.length() == 2); 5847 ASSERT(args.length() == 2);
5979 5848
5980 CONVERT_DOUBLE_CHECKED(x, args[0]); 5849 CONVERT_DOUBLE_CHECKED(x, args[0]);
5981 CONVERT_DOUBLE_CHECKED(y, args[1]); 5850 CONVERT_DOUBLE_CHECKED(y, args[1]);
5982 return isolate->heap()->NumberFromDouble(x + y); 5851 return isolate->heap()->NumberFromDouble(x + y);
5983 } 5852 }
5984 5853
5985 5854
5986 static MaybeObject* Runtime_NumberSub(RUNTIME_CALLING_CONVENTION) { 5855 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberSub) {
5987 RUNTIME_GET_ISOLATE;
5988 NoHandleAllocation ha; 5856 NoHandleAllocation ha;
5989 ASSERT(args.length() == 2); 5857 ASSERT(args.length() == 2);
5990 5858
5991 CONVERT_DOUBLE_CHECKED(x, args[0]); 5859 CONVERT_DOUBLE_CHECKED(x, args[0]);
5992 CONVERT_DOUBLE_CHECKED(y, args[1]); 5860 CONVERT_DOUBLE_CHECKED(y, args[1]);
5993 return isolate->heap()->NumberFromDouble(x - y); 5861 return isolate->heap()->NumberFromDouble(x - y);
5994 } 5862 }
5995 5863
5996 5864
5997 static MaybeObject* Runtime_NumberMul(RUNTIME_CALLING_CONVENTION) { 5865 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberMul) {
5998 RUNTIME_GET_ISOLATE;
5999 NoHandleAllocation ha; 5866 NoHandleAllocation ha;
6000 ASSERT(args.length() == 2); 5867 ASSERT(args.length() == 2);
6001 5868
6002 CONVERT_DOUBLE_CHECKED(x, args[0]); 5869 CONVERT_DOUBLE_CHECKED(x, args[0]);
6003 CONVERT_DOUBLE_CHECKED(y, args[1]); 5870 CONVERT_DOUBLE_CHECKED(y, args[1]);
6004 return isolate->heap()->NumberFromDouble(x * y); 5871 return isolate->heap()->NumberFromDouble(x * y);
6005 } 5872 }
6006 5873
6007 5874
6008 static MaybeObject* Runtime_NumberUnaryMinus(RUNTIME_CALLING_CONVENTION) { 5875 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberUnaryMinus) {
6009 RUNTIME_GET_ISOLATE;
6010 NoHandleAllocation ha; 5876 NoHandleAllocation ha;
6011 ASSERT(args.length() == 1); 5877 ASSERT(args.length() == 1);
6012 5878
6013 CONVERT_DOUBLE_CHECKED(x, args[0]); 5879 CONVERT_DOUBLE_CHECKED(x, args[0]);
6014 return isolate->heap()->NumberFromDouble(-x); 5880 return isolate->heap()->NumberFromDouble(-x);
6015 } 5881 }
6016 5882
6017 5883
6018 static MaybeObject* Runtime_NumberAlloc(RUNTIME_CALLING_CONVENTION) { 5884 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberAlloc) {
6019 RUNTIME_GET_ISOLATE;
6020 NoHandleAllocation ha; 5885 NoHandleAllocation ha;
6021 ASSERT(args.length() == 0); 5886 ASSERT(args.length() == 0);
6022 5887
6023 return isolate->heap()->NumberFromDouble(9876543210.0); 5888 return isolate->heap()->NumberFromDouble(9876543210.0);
6024 } 5889 }
6025 5890
6026 5891
6027 static MaybeObject* Runtime_NumberDiv(RUNTIME_CALLING_CONVENTION) { 5892 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberDiv) {
6028 RUNTIME_GET_ISOLATE;
6029 NoHandleAllocation ha; 5893 NoHandleAllocation ha;
6030 ASSERT(args.length() == 2); 5894 ASSERT(args.length() == 2);
6031 5895
6032 CONVERT_DOUBLE_CHECKED(x, args[0]); 5896 CONVERT_DOUBLE_CHECKED(x, args[0]);
6033 CONVERT_DOUBLE_CHECKED(y, args[1]); 5897 CONVERT_DOUBLE_CHECKED(y, args[1]);
6034 return isolate->heap()->NumberFromDouble(x / y); 5898 return isolate->heap()->NumberFromDouble(x / y);
6035 } 5899 }
6036 5900
6037 5901
6038 static MaybeObject* Runtime_NumberMod(RUNTIME_CALLING_CONVENTION) { 5902 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberMod) {
6039 RUNTIME_GET_ISOLATE;
6040 NoHandleAllocation ha; 5903 NoHandleAllocation ha;
6041 ASSERT(args.length() == 2); 5904 ASSERT(args.length() == 2);
6042 5905
6043 CONVERT_DOUBLE_CHECKED(x, args[0]); 5906 CONVERT_DOUBLE_CHECKED(x, args[0]);
6044 CONVERT_DOUBLE_CHECKED(y, args[1]); 5907 CONVERT_DOUBLE_CHECKED(y, args[1]);
6045 5908
6046 x = modulo(x, y); 5909 x = modulo(x, y);
6047 // NumberFromDouble may return a Smi instead of a Number object 5910 // NumberFromDouble may return a Smi instead of a Number object
6048 return isolate->heap()->NumberFromDouble(x); 5911 return isolate->heap()->NumberFromDouble(x);
6049 } 5912 }
6050 5913
6051 5914
6052 static MaybeObject* Runtime_StringAdd(RUNTIME_CALLING_CONVENTION) { 5915 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringAdd) {
6053 RUNTIME_GET_ISOLATE;
6054 NoHandleAllocation ha; 5916 NoHandleAllocation ha;
6055 ASSERT(args.length() == 2); 5917 ASSERT(args.length() == 2);
6056 CONVERT_CHECKED(String, str1, args[0]); 5918 CONVERT_CHECKED(String, str1, args[0]);
6057 CONVERT_CHECKED(String, str2, args[1]); 5919 CONVERT_CHECKED(String, str2, args[1]);
6058 isolate->counters()->string_add_runtime()->Increment(); 5920 isolate->counters()->string_add_runtime()->Increment();
6059 return isolate->heap()->AllocateConsString(str1, str2); 5921 return isolate->heap()->AllocateConsString(str1, str2);
6060 } 5922 }
6061 5923
6062 5924
6063 template <typename sinkchar> 5925 template <typename sinkchar>
(...skipping 28 matching lines...) Expand all
6092 } else { 5954 } else {
6093 String* string = String::cast(element); 5955 String* string = String::cast(element);
6094 int element_length = string->length(); 5956 int element_length = string->length();
6095 String::WriteToFlat(string, sink + position, 0, element_length); 5957 String::WriteToFlat(string, sink + position, 0, element_length);
6096 position += element_length; 5958 position += element_length;
6097 } 5959 }
6098 } 5960 }
6099 } 5961 }
6100 5962
6101 5963
6102 static MaybeObject* Runtime_StringBuilderConcat(RUNTIME_CALLING_CONVENTION) { 5964 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderConcat) {
6103 RUNTIME_GET_ISOLATE;
6104 NoHandleAllocation ha; 5965 NoHandleAllocation ha;
6105 ASSERT(args.length() == 3); 5966 ASSERT(args.length() == 3);
6106 CONVERT_CHECKED(JSArray, array, args[0]); 5967 CONVERT_CHECKED(JSArray, array, args[0]);
6107 if (!args[1]->IsSmi()) { 5968 if (!args[1]->IsSmi()) {
6108 isolate->context()->mark_out_of_memory(); 5969 isolate->context()->mark_out_of_memory();
6109 return Failure::OutOfMemoryException(); 5970 return Failure::OutOfMemoryException();
6110 } 5971 }
6111 int array_length = Smi::cast(args[1])->value(); 5972 int array_length = Smi::cast(args[1])->value();
6112 CONVERT_CHECKED(String, special, args[2]); 5973 CONVERT_CHECKED(String, special, args[2]);
6113 5974
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
6206 SeqTwoByteString* answer = SeqTwoByteString::cast(object); 6067 SeqTwoByteString* answer = SeqTwoByteString::cast(object);
6207 StringBuilderConcatHelper(special, 6068 StringBuilderConcatHelper(special,
6208 answer->GetChars(), 6069 answer->GetChars(),
6209 fixed_array, 6070 fixed_array,
6210 array_length); 6071 array_length);
6211 return answer; 6072 return answer;
6212 } 6073 }
6213 } 6074 }
6214 6075
6215 6076
6216 static MaybeObject* Runtime_StringBuilderJoin(RUNTIME_CALLING_CONVENTION) { 6077 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderJoin) {
6217 RUNTIME_GET_ISOLATE;
6218 NoHandleAllocation ha; 6078 NoHandleAllocation ha;
6219 ASSERT(args.length() == 3); 6079 ASSERT(args.length() == 3);
6220 CONVERT_CHECKED(JSArray, array, args[0]); 6080 CONVERT_CHECKED(JSArray, array, args[0]);
6221 if (!args[1]->IsSmi()) { 6081 if (!args[1]->IsSmi()) {
6222 isolate->context()->mark_out_of_memory(); 6082 isolate->context()->mark_out_of_memory();
6223 return Failure::OutOfMemoryException(); 6083 return Failure::OutOfMemoryException();
6224 } 6084 }
6225 int array_length = Smi::cast(args[1])->value(); 6085 int array_length = Smi::cast(args[1])->value();
6226 CONVERT_CHECKED(String, separator, args[2]); 6086 CONVERT_CHECKED(String, separator, args[2]);
6227 6087
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
6291 String::WriteToFlat(element, sink, 0, element_length); 6151 String::WriteToFlat(element, sink, 0, element_length);
6292 sink += element_length; 6152 sink += element_length;
6293 } 6153 }
6294 ASSERT(sink == end); 6154 ASSERT(sink == end);
6295 6155
6296 ASSERT(!answer->HasOnlyAsciiChars()); // Use %_FastAsciiArrayJoin instead. 6156 ASSERT(!answer->HasOnlyAsciiChars()); // Use %_FastAsciiArrayJoin instead.
6297 return answer; 6157 return answer;
6298 } 6158 }
6299 6159
6300 6160
6301 static MaybeObject* Runtime_NumberOr(RUNTIME_CALLING_CONVENTION) { 6161 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberOr) {
6302 RUNTIME_GET_ISOLATE;
6303 NoHandleAllocation ha; 6162 NoHandleAllocation ha;
6304 ASSERT(args.length() == 2); 6163 ASSERT(args.length() == 2);
6305 6164
6306 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 6165 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
6307 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 6166 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
6308 return isolate->heap()->NumberFromInt32(x | y); 6167 return isolate->heap()->NumberFromInt32(x | y);
6309 } 6168 }
6310 6169
6311 6170
6312 static MaybeObject* Runtime_NumberAnd(RUNTIME_CALLING_CONVENTION) { 6171 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberAnd) {
6313 RUNTIME_GET_ISOLATE;
6314 NoHandleAllocation ha; 6172 NoHandleAllocation ha;
6315 ASSERT(args.length() == 2); 6173 ASSERT(args.length() == 2);
6316 6174
6317 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 6175 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
6318 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 6176 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
6319 return isolate->heap()->NumberFromInt32(x & y); 6177 return isolate->heap()->NumberFromInt32(x & y);
6320 } 6178 }
6321 6179
6322 6180
6323 static MaybeObject* Runtime_NumberXor(RUNTIME_CALLING_CONVENTION) { 6181 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberXor) {
6324 RUNTIME_GET_ISOLATE;
6325 NoHandleAllocation ha; 6182 NoHandleAllocation ha;
6326 ASSERT(args.length() == 2); 6183 ASSERT(args.length() == 2);
6327 6184
6328 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 6185 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
6329 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 6186 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
6330 return isolate->heap()->NumberFromInt32(x ^ y); 6187 return isolate->heap()->NumberFromInt32(x ^ y);
6331 } 6188 }
6332 6189
6333 6190
6334 static MaybeObject* Runtime_NumberNot(RUNTIME_CALLING_CONVENTION) { 6191 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberNot) {
6335 RUNTIME_GET_ISOLATE;
6336 NoHandleAllocation ha; 6192 NoHandleAllocation ha;
6337 ASSERT(args.length() == 1); 6193 ASSERT(args.length() == 1);
6338 6194
6339 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 6195 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
6340 return isolate->heap()->NumberFromInt32(~x); 6196 return isolate->heap()->NumberFromInt32(~x);
6341 } 6197 }
6342 6198
6343 6199
6344 static MaybeObject* Runtime_NumberShl(RUNTIME_CALLING_CONVENTION) { 6200 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberShl) {
6345 RUNTIME_GET_ISOLATE;
6346 NoHandleAllocation ha; 6201 NoHandleAllocation ha;
6347 ASSERT(args.length() == 2); 6202 ASSERT(args.length() == 2);
6348 6203
6349 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 6204 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
6350 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 6205 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
6351 return isolate->heap()->NumberFromInt32(x << (y & 0x1f)); 6206 return isolate->heap()->NumberFromInt32(x << (y & 0x1f));
6352 } 6207 }
6353 6208
6354 6209
6355 static MaybeObject* Runtime_NumberShr(RUNTIME_CALLING_CONVENTION) { 6210 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberShr) {
6356 RUNTIME_GET_ISOLATE;
6357 NoHandleAllocation ha; 6211 NoHandleAllocation ha;
6358 ASSERT(args.length() == 2); 6212 ASSERT(args.length() == 2);
6359 6213
6360 CONVERT_NUMBER_CHECKED(uint32_t, x, Uint32, args[0]); 6214 CONVERT_NUMBER_CHECKED(uint32_t, x, Uint32, args[0]);
6361 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 6215 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
6362 return isolate->heap()->NumberFromUint32(x >> (y & 0x1f)); 6216 return isolate->heap()->NumberFromUint32(x >> (y & 0x1f));
6363 } 6217 }
6364 6218
6365 6219
6366 static MaybeObject* Runtime_NumberSar(RUNTIME_CALLING_CONVENTION) { 6220 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberSar) {
6367 RUNTIME_GET_ISOLATE;
6368 NoHandleAllocation ha; 6221 NoHandleAllocation ha;
6369 ASSERT(args.length() == 2); 6222 ASSERT(args.length() == 2);
6370 6223
6371 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 6224 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
6372 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 6225 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
6373 return isolate->heap()->NumberFromInt32(ArithmeticShiftRight(x, y & 0x1f)); 6226 return isolate->heap()->NumberFromInt32(ArithmeticShiftRight(x, y & 0x1f));
6374 } 6227 }
6375 6228
6376 6229
6377 static MaybeObject* Runtime_NumberEquals(RUNTIME_CALLING_CONVENTION) { 6230 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberEquals) {
6378 RUNTIME_GET_ISOLATE;
6379 NoHandleAllocation ha; 6231 NoHandleAllocation ha;
6380 ASSERT(args.length() == 2); 6232 ASSERT(args.length() == 2);
6381 6233
6382 CONVERT_DOUBLE_CHECKED(x, args[0]); 6234 CONVERT_DOUBLE_CHECKED(x, args[0]);
6383 CONVERT_DOUBLE_CHECKED(y, args[1]); 6235 CONVERT_DOUBLE_CHECKED(y, args[1]);
6384 if (isnan(x)) return Smi::FromInt(NOT_EQUAL); 6236 if (isnan(x)) return Smi::FromInt(NOT_EQUAL);
6385 if (isnan(y)) return Smi::FromInt(NOT_EQUAL); 6237 if (isnan(y)) return Smi::FromInt(NOT_EQUAL);
6386 if (x == y) return Smi::FromInt(EQUAL); 6238 if (x == y) return Smi::FromInt(EQUAL);
6387 Object* result; 6239 Object* result;
6388 if ((fpclassify(x) == FP_ZERO) && (fpclassify(y) == FP_ZERO)) { 6240 if ((fpclassify(x) == FP_ZERO) && (fpclassify(y) == FP_ZERO)) {
6389 result = Smi::FromInt(EQUAL); 6241 result = Smi::FromInt(EQUAL);
6390 } else { 6242 } else {
6391 result = Smi::FromInt(NOT_EQUAL); 6243 result = Smi::FromInt(NOT_EQUAL);
6392 } 6244 }
6393 return result; 6245 return result;
6394 } 6246 }
6395 6247
6396 6248
6397 static MaybeObject* Runtime_StringEquals(RUNTIME_CALLING_CONVENTION) { 6249 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringEquals) {
6398 RUNTIME_GET_ISOLATE;
6399 NoHandleAllocation ha; 6250 NoHandleAllocation ha;
6400 ASSERT(args.length() == 2); 6251 ASSERT(args.length() == 2);
6401 6252
6402 CONVERT_CHECKED(String, x, args[0]); 6253 CONVERT_CHECKED(String, x, args[0]);
6403 CONVERT_CHECKED(String, y, args[1]); 6254 CONVERT_CHECKED(String, y, args[1]);
6404 6255
6405 bool not_equal = !x->Equals(y); 6256 bool not_equal = !x->Equals(y);
6406 // This is slightly convoluted because the value that signifies 6257 // This is slightly convoluted because the value that signifies
6407 // equality is 0 and inequality is 1 so we have to negate the result 6258 // equality is 0 and inequality is 1 so we have to negate the result
6408 // from String::Equals. 6259 // from String::Equals.
6409 ASSERT(not_equal == 0 || not_equal == 1); 6260 ASSERT(not_equal == 0 || not_equal == 1);
6410 STATIC_CHECK(EQUAL == 0); 6261 STATIC_CHECK(EQUAL == 0);
6411 STATIC_CHECK(NOT_EQUAL == 1); 6262 STATIC_CHECK(NOT_EQUAL == 1);
6412 return Smi::FromInt(not_equal); 6263 return Smi::FromInt(not_equal);
6413 } 6264 }
6414 6265
6415 6266
6416 static MaybeObject* Runtime_NumberCompare(RUNTIME_CALLING_CONVENTION) { 6267 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberCompare) {
6417 RUNTIME_GET_ISOLATE;
6418 NoHandleAllocation ha; 6268 NoHandleAllocation ha;
6419 ASSERT(args.length() == 3); 6269 ASSERT(args.length() == 3);
6420 6270
6421 CONVERT_DOUBLE_CHECKED(x, args[0]); 6271 CONVERT_DOUBLE_CHECKED(x, args[0]);
6422 CONVERT_DOUBLE_CHECKED(y, args[1]); 6272 CONVERT_DOUBLE_CHECKED(y, args[1]);
6423 if (isnan(x) || isnan(y)) return args[2]; 6273 if (isnan(x) || isnan(y)) return args[2];
6424 if (x == y) return Smi::FromInt(EQUAL); 6274 if (x == y) return Smi::FromInt(EQUAL);
6425 if (isless(x, y)) return Smi::FromInt(LESS); 6275 if (isless(x, y)) return Smi::FromInt(LESS);
6426 return Smi::FromInt(GREATER); 6276 return Smi::FromInt(GREATER);
6427 } 6277 }
6428 6278
6429 6279
6430 // Compare two Smis as if they were converted to strings and then 6280 // Compare two Smis as if they were converted to strings and then
6431 // compared lexicographically. 6281 // compared lexicographically.
6432 static MaybeObject* Runtime_SmiLexicographicCompare( 6282 RUNTIME_FUNCTION(MaybeObject*, Runtime_SmiLexicographicCompare) {
6433 RUNTIME_CALLING_CONVENTION) {
6434 RUNTIME_GET_ISOLATE;
6435 NoHandleAllocation ha; 6283 NoHandleAllocation ha;
6436 ASSERT(args.length() == 2); 6284 ASSERT(args.length() == 2);
6437 6285
6438 // Extract the integer values from the Smis. 6286 // Extract the integer values from the Smis.
6439 CONVERT_CHECKED(Smi, x, args[0]); 6287 CONVERT_CHECKED(Smi, x, args[0]);
6440 CONVERT_CHECKED(Smi, y, args[1]); 6288 CONVERT_CHECKED(Smi, y, args[1]);
6441 int x_value = x->value(); 6289 int x_value = x->value();
6442 int y_value = y->value(); 6290 int y_value = y->value();
6443 6291
6444 // If the integers are equal so are the string representations. 6292 // If the integers are equal so are the string representations.
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
6547 result = equal_prefix_result; 6395 result = equal_prefix_result;
6548 } else { 6396 } else {
6549 result = (r < 0) ? Smi::FromInt(LESS) : Smi::FromInt(GREATER); 6397 result = (r < 0) ? Smi::FromInt(LESS) : Smi::FromInt(GREATER);
6550 } 6398 }
6551 ASSERT(result == 6399 ASSERT(result ==
6552 StringInputBufferCompare(Isolate::Current()->runtime_state(), x, y)); 6400 StringInputBufferCompare(Isolate::Current()->runtime_state(), x, y));
6553 return result; 6401 return result;
6554 } 6402 }
6555 6403
6556 6404
6557 static MaybeObject* Runtime_StringCompare(RUNTIME_CALLING_CONVENTION) { 6405 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCompare) {
6558 RUNTIME_GET_ISOLATE;
6559 NoHandleAllocation ha; 6406 NoHandleAllocation ha;
6560 ASSERT(args.length() == 2); 6407 ASSERT(args.length() == 2);
6561 6408
6562 CONVERT_CHECKED(String, x, args[0]); 6409 CONVERT_CHECKED(String, x, args[0]);
6563 CONVERT_CHECKED(String, y, args[1]); 6410 CONVERT_CHECKED(String, y, args[1]);
6564 6411
6565 isolate->counters()->string_compare_runtime()->Increment(); 6412 isolate->counters()->string_compare_runtime()->Increment();
6566 6413
6567 // A few fast case tests before we flatten. 6414 // A few fast case tests before we flatten.
6568 if (x == y) return Smi::FromInt(EQUAL); 6415 if (x == y) return Smi::FromInt(EQUAL);
(...skipping 14 matching lines...) Expand all
6583 } 6430 }
6584 { MaybeObject* maybe_obj = isolate->heap()->PrepareForCompare(y); 6431 { MaybeObject* maybe_obj = isolate->heap()->PrepareForCompare(y);
6585 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 6432 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
6586 } 6433 }
6587 6434
6588 return (x->IsFlat() && y->IsFlat()) ? FlatStringCompare(x, y) 6435 return (x->IsFlat() && y->IsFlat()) ? FlatStringCompare(x, y)
6589 : StringInputBufferCompare(isolate->runtime_state(), x, y); 6436 : StringInputBufferCompare(isolate->runtime_state(), x, y);
6590 } 6437 }
6591 6438
6592 6439
6593 static MaybeObject* Runtime_Math_acos(RUNTIME_CALLING_CONVENTION) { 6440 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_acos) {
6594 RUNTIME_GET_ISOLATE;
6595 NoHandleAllocation ha; 6441 NoHandleAllocation ha;
6596 ASSERT(args.length() == 1); 6442 ASSERT(args.length() == 1);
6597 isolate->counters()->math_acos()->Increment(); 6443 isolate->counters()->math_acos()->Increment();
6598 6444
6599 CONVERT_DOUBLE_CHECKED(x, args[0]); 6445 CONVERT_DOUBLE_CHECKED(x, args[0]);
6600 return isolate->transcendental_cache()->Get(TranscendentalCache::ACOS, x); 6446 return isolate->transcendental_cache()->Get(TranscendentalCache::ACOS, x);
6601 } 6447 }
6602 6448
6603 6449
6604 static MaybeObject* Runtime_Math_asin(RUNTIME_CALLING_CONVENTION) { 6450 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_asin) {
6605 RUNTIME_GET_ISOLATE;
6606 NoHandleAllocation ha; 6451 NoHandleAllocation ha;
6607 ASSERT(args.length() == 1); 6452 ASSERT(args.length() == 1);
6608 isolate->counters()->math_asin()->Increment(); 6453 isolate->counters()->math_asin()->Increment();
6609 6454
6610 CONVERT_DOUBLE_CHECKED(x, args[0]); 6455 CONVERT_DOUBLE_CHECKED(x, args[0]);
6611 return isolate->transcendental_cache()->Get(TranscendentalCache::ASIN, x); 6456 return isolate->transcendental_cache()->Get(TranscendentalCache::ASIN, x);
6612 } 6457 }
6613 6458
6614 6459
6615 static MaybeObject* Runtime_Math_atan(RUNTIME_CALLING_CONVENTION) { 6460 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_atan) {
6616 RUNTIME_GET_ISOLATE;
6617 NoHandleAllocation ha; 6461 NoHandleAllocation ha;
6618 ASSERT(args.length() == 1); 6462 ASSERT(args.length() == 1);
6619 isolate->counters()->math_atan()->Increment(); 6463 isolate->counters()->math_atan()->Increment();
6620 6464
6621 CONVERT_DOUBLE_CHECKED(x, args[0]); 6465 CONVERT_DOUBLE_CHECKED(x, args[0]);
6622 return isolate->transcendental_cache()->Get(TranscendentalCache::ATAN, x); 6466 return isolate->transcendental_cache()->Get(TranscendentalCache::ATAN, x);
6623 } 6467 }
6624 6468
6625 6469
6626 static const double kPiDividedBy4 = 0.78539816339744830962; 6470 static const double kPiDividedBy4 = 0.78539816339744830962;
6627 6471
6628 6472
6629 static MaybeObject* Runtime_Math_atan2(RUNTIME_CALLING_CONVENTION) { 6473 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_atan2) {
6630 RUNTIME_GET_ISOLATE;
6631 NoHandleAllocation ha; 6474 NoHandleAllocation ha;
6632 ASSERT(args.length() == 2); 6475 ASSERT(args.length() == 2);
6633 isolate->counters()->math_atan2()->Increment(); 6476 isolate->counters()->math_atan2()->Increment();
6634 6477
6635 CONVERT_DOUBLE_CHECKED(x, args[0]); 6478 CONVERT_DOUBLE_CHECKED(x, args[0]);
6636 CONVERT_DOUBLE_CHECKED(y, args[1]); 6479 CONVERT_DOUBLE_CHECKED(y, args[1]);
6637 double result; 6480 double result;
6638 if (isinf(x) && isinf(y)) { 6481 if (isinf(x) && isinf(y)) {
6639 // Make sure that the result in case of two infinite arguments 6482 // Make sure that the result in case of two infinite arguments
6640 // is a multiple of Pi / 4. The sign of the result is determined 6483 // is a multiple of Pi / 4. The sign of the result is determined
6641 // by the first argument (x) and the sign of the second argument 6484 // by the first argument (x) and the sign of the second argument
6642 // determines the multiplier: one or three. 6485 // determines the multiplier: one or three.
6643 int multiplier = (x < 0) ? -1 : 1; 6486 int multiplier = (x < 0) ? -1 : 1;
6644 if (y < 0) multiplier *= 3; 6487 if (y < 0) multiplier *= 3;
6645 result = multiplier * kPiDividedBy4; 6488 result = multiplier * kPiDividedBy4;
6646 } else { 6489 } else {
6647 result = atan2(x, y); 6490 result = atan2(x, y);
6648 } 6491 }
6649 return isolate->heap()->AllocateHeapNumber(result); 6492 return isolate->heap()->AllocateHeapNumber(result);
6650 } 6493 }
6651 6494
6652 6495
6653 static MaybeObject* Runtime_Math_ceil(RUNTIME_CALLING_CONVENTION) { 6496 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_ceil) {
6654 RUNTIME_GET_ISOLATE;
6655 NoHandleAllocation ha; 6497 NoHandleAllocation ha;
6656 ASSERT(args.length() == 1); 6498 ASSERT(args.length() == 1);
6657 isolate->counters()->math_ceil()->Increment(); 6499 isolate->counters()->math_ceil()->Increment();
6658 6500
6659 CONVERT_DOUBLE_CHECKED(x, args[0]); 6501 CONVERT_DOUBLE_CHECKED(x, args[0]);
6660 return isolate->heap()->NumberFromDouble(ceiling(x)); 6502 return isolate->heap()->NumberFromDouble(ceiling(x));
6661 } 6503 }
6662 6504
6663 6505
6664 static MaybeObject* Runtime_Math_cos(RUNTIME_CALLING_CONVENTION) { 6506 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_cos) {
6665 RUNTIME_GET_ISOLATE;
6666 NoHandleAllocation ha; 6507 NoHandleAllocation ha;
6667 ASSERT(args.length() == 1); 6508 ASSERT(args.length() == 1);
6668 isolate->counters()->math_cos()->Increment(); 6509 isolate->counters()->math_cos()->Increment();
6669 6510
6670 CONVERT_DOUBLE_CHECKED(x, args[0]); 6511 CONVERT_DOUBLE_CHECKED(x, args[0]);
6671 return isolate->transcendental_cache()->Get(TranscendentalCache::COS, x); 6512 return isolate->transcendental_cache()->Get(TranscendentalCache::COS, x);
6672 } 6513 }
6673 6514
6674 6515
6675 static MaybeObject* Runtime_Math_exp(RUNTIME_CALLING_CONVENTION) { 6516 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_exp) {
6676 RUNTIME_GET_ISOLATE;
6677 NoHandleAllocation ha; 6517 NoHandleAllocation ha;
6678 ASSERT(args.length() == 1); 6518 ASSERT(args.length() == 1);
6679 isolate->counters()->math_exp()->Increment(); 6519 isolate->counters()->math_exp()->Increment();
6680 6520
6681 CONVERT_DOUBLE_CHECKED(x, args[0]); 6521 CONVERT_DOUBLE_CHECKED(x, args[0]);
6682 return isolate->transcendental_cache()->Get(TranscendentalCache::EXP, x); 6522 return isolate->transcendental_cache()->Get(TranscendentalCache::EXP, x);
6683 } 6523 }
6684 6524
6685 6525
6686 static MaybeObject* Runtime_Math_floor(RUNTIME_CALLING_CONVENTION) { 6526 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_floor) {
6687 RUNTIME_GET_ISOLATE;
6688 NoHandleAllocation ha; 6527 NoHandleAllocation ha;
6689 ASSERT(args.length() == 1); 6528 ASSERT(args.length() == 1);
6690 isolate->counters()->math_floor()->Increment(); 6529 isolate->counters()->math_floor()->Increment();
6691 6530
6692 CONVERT_DOUBLE_CHECKED(x, args[0]); 6531 CONVERT_DOUBLE_CHECKED(x, args[0]);
6693 return isolate->heap()->NumberFromDouble(floor(x)); 6532 return isolate->heap()->NumberFromDouble(floor(x));
6694 } 6533 }
6695 6534
6696 6535
6697 static MaybeObject* Runtime_Math_log(RUNTIME_CALLING_CONVENTION) { 6536 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_log) {
6698 RUNTIME_GET_ISOLATE;
6699 NoHandleAllocation ha; 6537 NoHandleAllocation ha;
6700 ASSERT(args.length() == 1); 6538 ASSERT(args.length() == 1);
6701 isolate->counters()->math_log()->Increment(); 6539 isolate->counters()->math_log()->Increment();
6702 6540
6703 CONVERT_DOUBLE_CHECKED(x, args[0]); 6541 CONVERT_DOUBLE_CHECKED(x, args[0]);
6704 return isolate->transcendental_cache()->Get(TranscendentalCache::LOG, x); 6542 return isolate->transcendental_cache()->Get(TranscendentalCache::LOG, x);
6705 } 6543 }
6706 6544
6707 6545
6708 static MaybeObject* Runtime_Math_pow(RUNTIME_CALLING_CONVENTION) { 6546 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_pow) {
6709 RUNTIME_GET_ISOLATE;
6710 NoHandleAllocation ha; 6547 NoHandleAllocation ha;
6711 ASSERT(args.length() == 2); 6548 ASSERT(args.length() == 2);
6712 isolate->counters()->math_pow()->Increment(); 6549 isolate->counters()->math_pow()->Increment();
6713 6550
6714 CONVERT_DOUBLE_CHECKED(x, args[0]); 6551 CONVERT_DOUBLE_CHECKED(x, args[0]);
6715 6552
6716 // If the second argument is a smi, it is much faster to call the 6553 // If the second argument is a smi, it is much faster to call the
6717 // custom powi() function than the generic pow(). 6554 // custom powi() function than the generic pow().
6718 if (args[1]->IsSmi()) { 6555 if (args[1]->IsSmi()) {
6719 int y = Smi::cast(args[1])->value(); 6556 int y = Smi::cast(args[1])->value();
6720 return isolate->heap()->NumberFromDouble(power_double_int(x, y)); 6557 return isolate->heap()->NumberFromDouble(power_double_int(x, y));
6721 } 6558 }
6722 6559
6723 CONVERT_DOUBLE_CHECKED(y, args[1]); 6560 CONVERT_DOUBLE_CHECKED(y, args[1]);
6724 return isolate->heap()->AllocateHeapNumber(power_double_double(x, y)); 6561 return isolate->heap()->AllocateHeapNumber(power_double_double(x, y));
6725 } 6562 }
6726 6563
6727 // Fast version of Math.pow if we know that y is not an integer and 6564 // Fast version of Math.pow if we know that y is not an integer and
6728 // y is not -0.5 or 0.5. Used as slowcase from codegen. 6565 // y is not -0.5 or 0.5. Used as slowcase from codegen.
6729 static MaybeObject* Runtime_Math_pow_cfunction(RUNTIME_CALLING_CONVENTION) { 6566 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_pow_cfunction) {
6730 RUNTIME_GET_ISOLATE;
6731 NoHandleAllocation ha; 6567 NoHandleAllocation ha;
6732 ASSERT(args.length() == 2); 6568 ASSERT(args.length() == 2);
6733 CONVERT_DOUBLE_CHECKED(x, args[0]); 6569 CONVERT_DOUBLE_CHECKED(x, args[0]);
6734 CONVERT_DOUBLE_CHECKED(y, args[1]); 6570 CONVERT_DOUBLE_CHECKED(y, args[1]);
6735 if (y == 0) { 6571 if (y == 0) {
6736 return Smi::FromInt(1); 6572 return Smi::FromInt(1);
6737 } else if (isnan(y) || ((x == 1 || x == -1) && isinf(y))) { 6573 } else if (isnan(y) || ((x == 1 || x == -1) && isinf(y))) {
6738 return isolate->heap()->nan_value(); 6574 return isolate->heap()->nan_value();
6739 } else { 6575 } else {
6740 return isolate->heap()->AllocateHeapNumber(pow(x, y)); 6576 return isolate->heap()->AllocateHeapNumber(pow(x, y));
6741 } 6577 }
6742 } 6578 }
6743 6579
6744 6580
6745 static MaybeObject* Runtime_RoundNumber(RUNTIME_CALLING_CONVENTION) { 6581 RUNTIME_FUNCTION(MaybeObject*, Runtime_RoundNumber) {
6746 RUNTIME_GET_ISOLATE;
6747 NoHandleAllocation ha; 6582 NoHandleAllocation ha;
6748 ASSERT(args.length() == 1); 6583 ASSERT(args.length() == 1);
6749 isolate->counters()->math_round()->Increment(); 6584 isolate->counters()->math_round()->Increment();
6750 6585
6751 if (!args[0]->IsHeapNumber()) { 6586 if (!args[0]->IsHeapNumber()) {
6752 // Must be smi. Return the argument unchanged for all the other types 6587 // Must be smi. Return the argument unchanged for all the other types
6753 // to make fuzz-natives test happy. 6588 // to make fuzz-natives test happy.
6754 return args[0]; 6589 return args[0];
6755 } 6590 }
6756 6591
(...skipping 15 matching lines...) Expand all
6772 return number; 6607 return number;
6773 } 6608 }
6774 6609
6775 if (sign && value >= -0.5) return isolate->heap()->minus_zero_value(); 6610 if (sign && value >= -0.5) return isolate->heap()->minus_zero_value();
6776 6611
6777 // Do not call NumberFromDouble() to avoid extra checks. 6612 // Do not call NumberFromDouble() to avoid extra checks.
6778 return isolate->heap()->AllocateHeapNumber(floor(value + 0.5)); 6613 return isolate->heap()->AllocateHeapNumber(floor(value + 0.5));
6779 } 6614 }
6780 6615
6781 6616
6782 static MaybeObject* Runtime_Math_sin(RUNTIME_CALLING_CONVENTION) { 6617 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_sin) {
6783 RUNTIME_GET_ISOLATE;
6784 NoHandleAllocation ha; 6618 NoHandleAllocation ha;
6785 ASSERT(args.length() == 1); 6619 ASSERT(args.length() == 1);
6786 isolate->counters()->math_sin()->Increment(); 6620 isolate->counters()->math_sin()->Increment();
6787 6621
6788 CONVERT_DOUBLE_CHECKED(x, args[0]); 6622 CONVERT_DOUBLE_CHECKED(x, args[0]);
6789 return isolate->transcendental_cache()->Get(TranscendentalCache::SIN, x); 6623 return isolate->transcendental_cache()->Get(TranscendentalCache::SIN, x);
6790 } 6624 }
6791 6625
6792 6626
6793 static MaybeObject* Runtime_Math_sqrt(RUNTIME_CALLING_CONVENTION) { 6627 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_sqrt) {
6794 RUNTIME_GET_ISOLATE;
6795 NoHandleAllocation ha; 6628 NoHandleAllocation ha;
6796 ASSERT(args.length() == 1); 6629 ASSERT(args.length() == 1);
6797 isolate->counters()->math_sqrt()->Increment(); 6630 isolate->counters()->math_sqrt()->Increment();
6798 6631
6799 CONVERT_DOUBLE_CHECKED(x, args[0]); 6632 CONVERT_DOUBLE_CHECKED(x, args[0]);
6800 return isolate->heap()->AllocateHeapNumber(sqrt(x)); 6633 return isolate->heap()->AllocateHeapNumber(sqrt(x));
6801 } 6634 }
6802 6635
6803 6636
6804 static MaybeObject* Runtime_Math_tan(RUNTIME_CALLING_CONVENTION) { 6637 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_tan) {
6805 RUNTIME_GET_ISOLATE;
6806 NoHandleAllocation ha; 6638 NoHandleAllocation ha;
6807 ASSERT(args.length() == 1); 6639 ASSERT(args.length() == 1);
6808 isolate->counters()->math_tan()->Increment(); 6640 isolate->counters()->math_tan()->Increment();
6809 6641
6810 CONVERT_DOUBLE_CHECKED(x, args[0]); 6642 CONVERT_DOUBLE_CHECKED(x, args[0]);
6811 return isolate->transcendental_cache()->Get(TranscendentalCache::TAN, x); 6643 return isolate->transcendental_cache()->Get(TranscendentalCache::TAN, x);
6812 } 6644 }
6813 6645
6814 6646
6815 static int MakeDay(int year, int month, int day) { 6647 static int MakeDay(int year, int month, int day) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
6850 base_day; 6682 base_day;
6851 6683
6852 if (year % 4 || (year % 100 == 0 && year % 400 != 0)) { 6684 if (year % 4 || (year % 100 == 0 && year % 400 != 0)) {
6853 return day_from_year + day_from_month[month] + day - 1; 6685 return day_from_year + day_from_month[month] + day - 1;
6854 } 6686 }
6855 6687
6856 return day_from_year + day_from_month_leap[month] + day - 1; 6688 return day_from_year + day_from_month_leap[month] + day - 1;
6857 } 6689 }
6858 6690
6859 6691
6860 static MaybeObject* Runtime_DateMakeDay(RUNTIME_CALLING_CONVENTION) { 6692 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateMakeDay) {
6861 RUNTIME_GET_ISOLATE;
6862 NoHandleAllocation ha; 6693 NoHandleAllocation ha;
6863 ASSERT(args.length() == 3); 6694 ASSERT(args.length() == 3);
6864 6695
6865 CONVERT_SMI_CHECKED(year, args[0]); 6696 CONVERT_SMI_CHECKED(year, args[0]);
6866 CONVERT_SMI_CHECKED(month, args[1]); 6697 CONVERT_SMI_CHECKED(month, args[1]);
6867 CONVERT_SMI_CHECKED(date, args[2]); 6698 CONVERT_SMI_CHECKED(date, args[2]);
6868 6699
6869 return Smi::FromInt(MakeDay(year, month, date)); 6700 return Smi::FromInt(MakeDay(year, month, date));
6870 } 6701 }
6871 6702
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
7150 static inline void DateYMDFromTime(int date, 6981 static inline void DateYMDFromTime(int date,
7151 int& year, int& month, int& day) { 6982 int& year, int& month, int& day) {
7152 if (date >= 0 && date < 32 * kDaysIn4Years) { 6983 if (date >= 0 && date < 32 * kDaysIn4Years) {
7153 DateYMDFromTimeAfter1970(date, year, month, day); 6984 DateYMDFromTimeAfter1970(date, year, month, day);
7154 } else { 6985 } else {
7155 DateYMDFromTimeSlow(date, year, month, day); 6986 DateYMDFromTimeSlow(date, year, month, day);
7156 } 6987 }
7157 } 6988 }
7158 6989
7159 6990
7160 static MaybeObject* Runtime_DateYMDFromTime(RUNTIME_CALLING_CONVENTION) { 6991 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateYMDFromTime) {
7161 RUNTIME_GET_ISOLATE;
7162 NoHandleAllocation ha; 6992 NoHandleAllocation ha;
7163 ASSERT(args.length() == 2); 6993 ASSERT(args.length() == 2);
7164 6994
7165 CONVERT_DOUBLE_CHECKED(t, args[0]); 6995 CONVERT_DOUBLE_CHECKED(t, args[0]);
7166 CONVERT_CHECKED(JSArray, res_array, args[1]); 6996 CONVERT_CHECKED(JSArray, res_array, args[1]);
7167 6997
7168 int year, month, day; 6998 int year, month, day;
7169 DateYMDFromTime(static_cast<int>(floor(t / 86400000)), year, month, day); 6999 DateYMDFromTime(static_cast<int>(floor(t / 86400000)), year, month, day);
7170 7000
7171 RUNTIME_ASSERT(res_array->elements()->map() == 7001 RUNTIME_ASSERT(res_array->elements()->map() ==
7172 isolate->heap()->fixed_array_map()); 7002 isolate->heap()->fixed_array_map());
7173 FixedArray* elms = FixedArray::cast(res_array->elements()); 7003 FixedArray* elms = FixedArray::cast(res_array->elements());
7174 RUNTIME_ASSERT(elms->length() == 3); 7004 RUNTIME_ASSERT(elms->length() == 3);
7175 7005
7176 elms->set(0, Smi::FromInt(year)); 7006 elms->set(0, Smi::FromInt(year));
7177 elms->set(1, Smi::FromInt(month)); 7007 elms->set(1, Smi::FromInt(month));
7178 elms->set(2, Smi::FromInt(day)); 7008 elms->set(2, Smi::FromInt(day));
7179 7009
7180 return isolate->heap()->undefined_value(); 7010 return isolate->heap()->undefined_value();
7181 } 7011 }
7182 7012
7183 7013
7184 static MaybeObject* Runtime_NewArgumentsFast(RUNTIME_CALLING_CONVENTION) { 7014 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewArgumentsFast) {
7185 RUNTIME_GET_ISOLATE;
7186 NoHandleAllocation ha; 7015 NoHandleAllocation ha;
7187 ASSERT(args.length() == 3); 7016 ASSERT(args.length() == 3);
7188 7017
7189 JSFunction* callee = JSFunction::cast(args[0]); 7018 JSFunction* callee = JSFunction::cast(args[0]);
7190 Object** parameters = reinterpret_cast<Object**>(args[1]); 7019 Object** parameters = reinterpret_cast<Object**>(args[1]);
7191 const int length = Smi::cast(args[2])->value(); 7020 const int length = Smi::cast(args[2])->value();
7192 7021
7193 Object* result; 7022 Object* result;
7194 { MaybeObject* maybe_result = 7023 { MaybeObject* maybe_result =
7195 isolate->heap()->AllocateArgumentsObject(callee, length); 7024 isolate->heap()->AllocateArgumentsObject(callee, length);
(...skipping 15 matching lines...) Expand all
7211 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc); 7040 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc);
7212 for (int i = 0; i < length; i++) { 7041 for (int i = 0; i < length; i++) {
7213 array->set(i, *--parameters, mode); 7042 array->set(i, *--parameters, mode);
7214 } 7043 }
7215 JSObject::cast(result)->set_elements(FixedArray::cast(obj)); 7044 JSObject::cast(result)->set_elements(FixedArray::cast(obj));
7216 } 7045 }
7217 return result; 7046 return result;
7218 } 7047 }
7219 7048
7220 7049
7221 static MaybeObject* Runtime_NewClosure(RUNTIME_CALLING_CONVENTION) { 7050 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewClosure) {
7222 RUNTIME_GET_ISOLATE;
7223 HandleScope scope(isolate); 7051 HandleScope scope(isolate);
7224 ASSERT(args.length() == 3); 7052 ASSERT(args.length() == 3);
7225 CONVERT_ARG_CHECKED(Context, context, 0); 7053 CONVERT_ARG_CHECKED(Context, context, 0);
7226 CONVERT_ARG_CHECKED(SharedFunctionInfo, shared, 1); 7054 CONVERT_ARG_CHECKED(SharedFunctionInfo, shared, 1);
7227 CONVERT_BOOLEAN_CHECKED(pretenure, args[2]); 7055 CONVERT_BOOLEAN_CHECKED(pretenure, args[2]);
7228 7056
7229 // Allocate global closures in old space and allocate local closures 7057 // Allocate global closures in old space and allocate local closures
7230 // in new space. Additionally pretenure closures that are assigned 7058 // in new space. Additionally pretenure closures that are assigned
7231 // directly to properties. 7059 // directly to properties.
7232 pretenure = pretenure || (context->global_context() == *context); 7060 pretenure = pretenure || (context->global_context() == *context);
7233 PretenureFlag pretenure_flag = pretenure ? TENURED : NOT_TENURED; 7061 PretenureFlag pretenure_flag = pretenure ? TENURED : NOT_TENURED;
7234 Handle<JSFunction> result = 7062 Handle<JSFunction> result =
7235 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, 7063 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared,
7236 context, 7064 context,
7237 pretenure_flag); 7065 pretenure_flag);
7238 return *result; 7066 return *result;
7239 } 7067 }
7240 7068
7241 static MaybeObject* Runtime_NewObjectFromBound(RUNTIME_CALLING_CONVENTION) { 7069 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewObjectFromBound) {
7242 RUNTIME_GET_ISOLATE;
7243 HandleScope scope(isolate); 7070 HandleScope scope(isolate);
7244 ASSERT(args.length() == 2); 7071 ASSERT(args.length() == 2);
7245 // First argument is a function to use as a constructor. 7072 // First argument is a function to use as a constructor.
7246 CONVERT_ARG_CHECKED(JSFunction, function, 0); 7073 CONVERT_ARG_CHECKED(JSFunction, function, 0);
7247 7074
7248 // Second argument is either null or an array of bound arguments. 7075 // Second argument is either null or an array of bound arguments.
7249 FixedArray* bound_args = NULL; 7076 FixedArray* bound_args = NULL;
7250 int bound_argc = 0; 7077 int bound_argc = 0;
7251 if (!args[1]->IsNull()) { 7078 if (!args[1]->IsNull()) {
7252 CONVERT_ARG_CHECKED(JSArray, params, 1); 7079 CONVERT_ARG_CHECKED(JSArray, params, 1);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
7297 ConstructStubCompiler compiler; 7124 ConstructStubCompiler compiler;
7298 MaybeObject* code = compiler.CompileConstructStub(*function); 7125 MaybeObject* code = compiler.CompileConstructStub(*function);
7299 if (!code->IsFailure()) { 7126 if (!code->IsFailure()) {
7300 function->shared()->set_construct_stub( 7127 function->shared()->set_construct_stub(
7301 Code::cast(code->ToObjectUnchecked())); 7128 Code::cast(code->ToObjectUnchecked()));
7302 } 7129 }
7303 } 7130 }
7304 } 7131 }
7305 7132
7306 7133
7307 static MaybeObject* Runtime_NewObject(RUNTIME_CALLING_CONVENTION) { 7134 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewObject) {
7308 RUNTIME_GET_ISOLATE;
7309 HandleScope scope(isolate); 7135 HandleScope scope(isolate);
7310 ASSERT(args.length() == 1); 7136 ASSERT(args.length() == 1);
7311 7137
7312 Handle<Object> constructor = args.at<Object>(0); 7138 Handle<Object> constructor = args.at<Object>(0);
7313 7139
7314 // If the constructor isn't a proper function we throw a type error. 7140 // If the constructor isn't a proper function we throw a type error.
7315 if (!constructor->IsJSFunction()) { 7141 if (!constructor->IsJSFunction()) {
7316 Vector< Handle<Object> > arguments = HandleVector(&constructor, 1); 7142 Vector< Handle<Object> > arguments = HandleVector(&constructor, 1);
7317 Handle<Object> type_error = 7143 Handle<Object> type_error =
7318 isolate->factory()->NewTypeError("not_constructor", arguments); 7144 isolate->factory()->NewTypeError("not_constructor", arguments);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
7378 TrySettingInlineConstructStub(isolate, function); 7204 TrySettingInlineConstructStub(isolate, function);
7379 } 7205 }
7380 7206
7381 isolate->counters()->constructed_objects()->Increment(); 7207 isolate->counters()->constructed_objects()->Increment();
7382 isolate->counters()->constructed_objects_runtime()->Increment(); 7208 isolate->counters()->constructed_objects_runtime()->Increment();
7383 7209
7384 return *result; 7210 return *result;
7385 } 7211 }
7386 7212
7387 7213
7388 static MaybeObject* Runtime_FinalizeInstanceSize(RUNTIME_CALLING_CONVENTION) { 7214 RUNTIME_FUNCTION(MaybeObject*, Runtime_FinalizeInstanceSize) {
7389 RUNTIME_GET_ISOLATE;
7390 HandleScope scope(isolate); 7215 HandleScope scope(isolate);
7391 ASSERT(args.length() == 1); 7216 ASSERT(args.length() == 1);
7392 7217
7393 CONVERT_ARG_CHECKED(JSFunction, function, 0); 7218 CONVERT_ARG_CHECKED(JSFunction, function, 0);
7394 function->shared()->CompleteInobjectSlackTracking(); 7219 function->shared()->CompleteInobjectSlackTracking();
7395 TrySettingInlineConstructStub(isolate, function); 7220 TrySettingInlineConstructStub(isolate, function);
7396 7221
7397 return isolate->heap()->undefined_value(); 7222 return isolate->heap()->undefined_value();
7398 } 7223 }
7399 7224
7400 7225
7401 static MaybeObject* Runtime_LazyCompile(RUNTIME_CALLING_CONVENTION) { 7226 RUNTIME_FUNCTION(MaybeObject*, Runtime_LazyCompile) {
7402 RUNTIME_GET_ISOLATE;
7403 HandleScope scope(isolate); 7227 HandleScope scope(isolate);
7404 ASSERT(args.length() == 1); 7228 ASSERT(args.length() == 1);
7405 7229
7406 Handle<JSFunction> function = args.at<JSFunction>(0); 7230 Handle<JSFunction> function = args.at<JSFunction>(0);
7407 #ifdef DEBUG 7231 #ifdef DEBUG
7408 if (FLAG_trace_lazy && !function->shared()->is_compiled()) { 7232 if (FLAG_trace_lazy && !function->shared()->is_compiled()) {
7409 PrintF("[lazy: "); 7233 PrintF("[lazy: ");
7410 function->PrintName(); 7234 function->PrintName();
7411 PrintF("]\n"); 7235 PrintF("]\n");
7412 } 7236 }
(...skipping 10 matching lines...) Expand all
7423 if (!CompileLazyInLoop(function, KEEP_EXCEPTION)) { 7247 if (!CompileLazyInLoop(function, KEEP_EXCEPTION)) {
7424 return Failure::Exception(); 7248 return Failure::Exception();
7425 } 7249 }
7426 7250
7427 // All done. Return the compiled code. 7251 // All done. Return the compiled code.
7428 ASSERT(function->is_compiled()); 7252 ASSERT(function->is_compiled());
7429 return function->code(); 7253 return function->code();
7430 } 7254 }
7431 7255
7432 7256
7433 static MaybeObject* Runtime_LazyRecompile(RUNTIME_CALLING_CONVENTION) { 7257 RUNTIME_FUNCTION(MaybeObject*, Runtime_LazyRecompile) {
7434 RUNTIME_GET_ISOLATE;
7435 HandleScope scope(isolate); 7258 HandleScope scope(isolate);
7436 ASSERT(args.length() == 1); 7259 ASSERT(args.length() == 1);
7437 Handle<JSFunction> function = args.at<JSFunction>(0); 7260 Handle<JSFunction> function = args.at<JSFunction>(0);
7438 // If the function is not optimizable or debugger is active continue using the 7261 // If the function is not optimizable or debugger is active continue using the
7439 // code from the full compiler. 7262 // code from the full compiler.
7440 if (!function->shared()->code()->optimizable() || 7263 if (!function->shared()->code()->optimizable() ||
7441 isolate->debug()->has_break_points()) { 7264 isolate->debug()->has_break_points()) {
7442 if (FLAG_trace_opt) { 7265 if (FLAG_trace_opt) {
7443 PrintF("[failed to optimize "); 7266 PrintF("[failed to optimize ");
7444 function->PrintName(); 7267 function->PrintName();
(...skipping 10 matching lines...) Expand all
7455 if (FLAG_trace_opt) { 7278 if (FLAG_trace_opt) {
7456 PrintF("[failed to optimize "); 7279 PrintF("[failed to optimize ");
7457 function->PrintName(); 7280 function->PrintName();
7458 PrintF(": optimized compilation failed]\n"); 7281 PrintF(": optimized compilation failed]\n");
7459 } 7282 }
7460 function->ReplaceCode(function->shared()->code()); 7283 function->ReplaceCode(function->shared()->code());
7461 return function->code(); 7284 return function->code();
7462 } 7285 }
7463 7286
7464 7287
7465 static MaybeObject* Runtime_NotifyDeoptimized(RUNTIME_CALLING_CONVENTION) { 7288 RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyDeoptimized) {
7466 RUNTIME_GET_ISOLATE;
7467 HandleScope scope(isolate); 7289 HandleScope scope(isolate);
7468 ASSERT(args.length() == 1); 7290 ASSERT(args.length() == 1);
7469 RUNTIME_ASSERT(args[0]->IsSmi()); 7291 RUNTIME_ASSERT(args[0]->IsSmi());
7470 Deoptimizer::BailoutType type = 7292 Deoptimizer::BailoutType type =
7471 static_cast<Deoptimizer::BailoutType>(Smi::cast(args[0])->value()); 7293 static_cast<Deoptimizer::BailoutType>(Smi::cast(args[0])->value());
7472 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate); 7294 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate);
7473 ASSERT(isolate->heap()->IsAllocationAllowed()); 7295 ASSERT(isolate->heap()->IsAllocationAllowed());
7474 int frames = deoptimizer->output_count(); 7296 int frames = deoptimizer->output_count();
7475 7297
7476 JavaScriptFrameIterator it; 7298 JavaScriptFrameIterator it;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
7530 PrintF("[removing optimized code for: "); 7352 PrintF("[removing optimized code for: ");
7531 function->PrintName(); 7353 function->PrintName();
7532 PrintF("]\n"); 7354 PrintF("]\n");
7533 } 7355 }
7534 function->ReplaceCode(function->shared()->code()); 7356 function->ReplaceCode(function->shared()->code());
7535 } 7357 }
7536 return isolate->heap()->undefined_value(); 7358 return isolate->heap()->undefined_value();
7537 } 7359 }
7538 7360
7539 7361
7540 static MaybeObject* Runtime_NotifyOSR(RUNTIME_CALLING_CONVENTION) { 7362 RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyOSR) {
7541 RUNTIME_GET_ISOLATE;
7542 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate); 7363 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate);
7543 delete deoptimizer; 7364 delete deoptimizer;
7544 return isolate->heap()->undefined_value(); 7365 return isolate->heap()->undefined_value();
7545 } 7366 }
7546 7367
7547 7368
7548 static MaybeObject* Runtime_DeoptimizeFunction(RUNTIME_CALLING_CONVENTION) { 7369 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeoptimizeFunction) {
7549 RUNTIME_GET_ISOLATE;
7550 HandleScope scope(isolate); 7370 HandleScope scope(isolate);
7551 ASSERT(args.length() == 1); 7371 ASSERT(args.length() == 1);
7552 CONVERT_ARG_CHECKED(JSFunction, function, 0); 7372 CONVERT_ARG_CHECKED(JSFunction, function, 0);
7553 if (!function->IsOptimized()) return isolate->heap()->undefined_value(); 7373 if (!function->IsOptimized()) return isolate->heap()->undefined_value();
7554 7374
7555 Deoptimizer::DeoptimizeFunction(*function); 7375 Deoptimizer::DeoptimizeFunction(*function);
7556 7376
7557 return isolate->heap()->undefined_value(); 7377 return isolate->heap()->undefined_value();
7558 } 7378 }
7559 7379
7560 7380
7561 static MaybeObject* Runtime_CompileForOnStackReplacement( 7381 RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileForOnStackReplacement) {
7562 RUNTIME_CALLING_CONVENTION) {
7563 RUNTIME_GET_ISOLATE;
7564 HandleScope scope(isolate); 7382 HandleScope scope(isolate);
7565 ASSERT(args.length() == 1); 7383 ASSERT(args.length() == 1);
7566 CONVERT_ARG_CHECKED(JSFunction, function, 0); 7384 CONVERT_ARG_CHECKED(JSFunction, function, 0);
7567 7385
7568 // We're not prepared to handle a function with arguments object. 7386 // We're not prepared to handle a function with arguments object.
7569 ASSERT(!function->shared()->scope_info()->HasArgumentsShadow()); 7387 ASSERT(!function->shared()->scope_info()->HasArgumentsShadow());
7570 7388
7571 // We have hit a back edge in an unoptimized frame for a function that was 7389 // We have hit a back edge in an unoptimized frame for a function that was
7572 // selected for on-stack replacement. Find the unoptimized code object. 7390 // selected for on-stack replacement. Find the unoptimized code object.
7573 Handle<Code> unoptimized(function->shared()->code(), isolate); 7391 Handle<Code> unoptimized(function->shared()->code(), isolate);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
7667 return Smi::FromInt(ast_id); 7485 return Smi::FromInt(ast_id);
7668 } else { 7486 } else {
7669 if (function->IsMarkedForLazyRecompilation()) { 7487 if (function->IsMarkedForLazyRecompilation()) {
7670 function->ReplaceCode(function->shared()->code()); 7488 function->ReplaceCode(function->shared()->code());
7671 } 7489 }
7672 return Smi::FromInt(-1); 7490 return Smi::FromInt(-1);
7673 } 7491 }
7674 } 7492 }
7675 7493
7676 7494
7677 static MaybeObject* Runtime_GetFunctionDelegate(RUNTIME_CALLING_CONVENTION) { 7495 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFunctionDelegate) {
7678 RUNTIME_GET_ISOLATE;
7679 HandleScope scope(isolate); 7496 HandleScope scope(isolate);
7680 ASSERT(args.length() == 1); 7497 ASSERT(args.length() == 1);
7681 RUNTIME_ASSERT(!args[0]->IsJSFunction()); 7498 RUNTIME_ASSERT(!args[0]->IsJSFunction());
7682 return *Execution::GetFunctionDelegate(args.at<Object>(0)); 7499 return *Execution::GetFunctionDelegate(args.at<Object>(0));
7683 } 7500 }
7684 7501
7685 7502
7686 static MaybeObject* Runtime_GetConstructorDelegate(RUNTIME_CALLING_CONVENTION) { 7503 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetConstructorDelegate) {
7687 RUNTIME_GET_ISOLATE;
7688 HandleScope scope(isolate); 7504 HandleScope scope(isolate);
7689 ASSERT(args.length() == 1); 7505 ASSERT(args.length() == 1);
7690 RUNTIME_ASSERT(!args[0]->IsJSFunction()); 7506 RUNTIME_ASSERT(!args[0]->IsJSFunction());
7691 return *Execution::GetConstructorDelegate(args.at<Object>(0)); 7507 return *Execution::GetConstructorDelegate(args.at<Object>(0));
7692 } 7508 }
7693 7509
7694 7510
7695 static MaybeObject* Runtime_NewContext(RUNTIME_CALLING_CONVENTION) { 7511 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewContext) {
7696 RUNTIME_GET_ISOLATE;
7697 NoHandleAllocation ha; 7512 NoHandleAllocation ha;
7698 ASSERT(args.length() == 1); 7513 ASSERT(args.length() == 1);
7699 7514
7700 CONVERT_CHECKED(JSFunction, function, args[0]); 7515 CONVERT_CHECKED(JSFunction, function, args[0]);
7701 int length = function->shared()->scope_info()->NumberOfContextSlots(); 7516 int length = function->shared()->scope_info()->NumberOfContextSlots();
7702 Object* result; 7517 Object* result;
7703 { MaybeObject* maybe_result = 7518 { MaybeObject* maybe_result =
7704 isolate->heap()->AllocateFunctionContext(length, function); 7519 isolate->heap()->AllocateFunctionContext(length, function);
7705 if (!maybe_result->ToObject(&result)) return maybe_result; 7520 if (!maybe_result->ToObject(&result)) return maybe_result;
7706 } 7521 }
(...skipping 30 matching lines...) Expand all
7737 if (!maybe_result->ToObject(&result)) return maybe_result; 7552 if (!maybe_result->ToObject(&result)) return maybe_result;
7738 } 7553 }
7739 7554
7740 Context* context = Context::cast(result); 7555 Context* context = Context::cast(result);
7741 isolate->set_context(context); 7556 isolate->set_context(context);
7742 7557
7743 return result; 7558 return result;
7744 } 7559 }
7745 7560
7746 7561
7747 static MaybeObject* Runtime_PushContext(RUNTIME_CALLING_CONVENTION) { 7562 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushContext) {
7748 RUNTIME_GET_ISOLATE;
7749 NoHandleAllocation ha; 7563 NoHandleAllocation ha;
7750 ASSERT(args.length() == 1); 7564 ASSERT(args.length() == 1);
7751 return PushContextHelper(isolate, args[0], false); 7565 return PushContextHelper(isolate, args[0], false);
7752 } 7566 }
7753 7567
7754 7568
7755 static MaybeObject* Runtime_PushCatchContext(RUNTIME_CALLING_CONVENTION) { 7569 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushCatchContext) {
7756 RUNTIME_GET_ISOLATE;
7757 NoHandleAllocation ha; 7570 NoHandleAllocation ha;
7758 ASSERT(args.length() == 1); 7571 ASSERT(args.length() == 1);
7759 return PushContextHelper(isolate, args[0], true); 7572 return PushContextHelper(isolate, args[0], true);
7760 } 7573 }
7761 7574
7762 7575
7763 static MaybeObject* Runtime_DeleteContextSlot(RUNTIME_CALLING_CONVENTION) { 7576 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteContextSlot) {
7764 RUNTIME_GET_ISOLATE;
7765 HandleScope scope(isolate); 7577 HandleScope scope(isolate);
7766 ASSERT(args.length() == 2); 7578 ASSERT(args.length() == 2);
7767 7579
7768 CONVERT_ARG_CHECKED(Context, context, 0); 7580 CONVERT_ARG_CHECKED(Context, context, 0);
7769 CONVERT_ARG_CHECKED(String, name, 1); 7581 CONVERT_ARG_CHECKED(String, name, 1);
7770 7582
7771 int index; 7583 int index;
7772 PropertyAttributes attributes; 7584 PropertyAttributes attributes;
7773 ContextLookupFlags flags = FOLLOW_CHAINS; 7585 ContextLookupFlags flags = FOLLOW_CHAINS;
7774 Handle<Object> holder = context->Lookup(name, flags, &index, &attributes); 7586 Handle<Object> holder = context->Lookup(name, flags, &index, &attributes);
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
7914 HandleVector(&name, 1)); 7726 HandleVector(&name, 1));
7915 return MakePair(isolate->Throw(*reference_error), NULL); 7727 return MakePair(isolate->Throw(*reference_error), NULL);
7916 } else { 7728 } else {
7917 // The property doesn't exist - return undefined 7729 // The property doesn't exist - return undefined
7918 return MakePair(isolate->heap()->undefined_value(), 7730 return MakePair(isolate->heap()->undefined_value(),
7919 isolate->heap()->undefined_value()); 7731 isolate->heap()->undefined_value());
7920 } 7732 }
7921 } 7733 }
7922 7734
7923 7735
7924 static ObjectPair Runtime_LoadContextSlot(RUNTIME_CALLING_CONVENTION) { 7736 RUNTIME_FUNCTION(ObjectPair, Runtime_LoadContextSlot) {
7925 RUNTIME_GET_ISOLATE;
7926 return LoadContextSlotHelper(args, isolate, true); 7737 return LoadContextSlotHelper(args, isolate, true);
7927 } 7738 }
7928 7739
7929 7740
7930 static ObjectPair Runtime_LoadContextSlotNoReferenceError( 7741 RUNTIME_FUNCTION(ObjectPair, Runtime_LoadContextSlotNoReferenceError) {
7931 RUNTIME_CALLING_CONVENTION) {
7932 RUNTIME_GET_ISOLATE;
7933 return LoadContextSlotHelper(args, isolate, false); 7742 return LoadContextSlotHelper(args, isolate, false);
7934 } 7743 }
7935 7744
7936 7745
7937 static MaybeObject* Runtime_StoreContextSlot(RUNTIME_CALLING_CONVENTION) { 7746 RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreContextSlot) {
7938 RUNTIME_GET_ISOLATE;
7939 HandleScope scope(isolate); 7747 HandleScope scope(isolate);
7940 ASSERT(args.length() == 4); 7748 ASSERT(args.length() == 4);
7941 7749
7942 Handle<Object> value(args[0], isolate); 7750 Handle<Object> value(args[0], isolate);
7943 CONVERT_ARG_CHECKED(Context, context, 1); 7751 CONVERT_ARG_CHECKED(Context, context, 1);
7944 CONVERT_ARG_CHECKED(String, name, 2); 7752 CONVERT_ARG_CHECKED(String, name, 2);
7945 CONVERT_SMI_CHECKED(strict_unchecked, args[3]); 7753 CONVERT_SMI_CHECKED(strict_unchecked, args[3]);
7946 RUNTIME_ASSERT(strict_unchecked == kStrictMode || 7754 RUNTIME_ASSERT(strict_unchecked == kStrictMode ||
7947 strict_unchecked == kNonStrictMode); 7755 strict_unchecked == kNonStrictMode);
7948 StrictModeFlag strict_mode = static_cast<StrictModeFlag>(strict_unchecked); 7756 StrictModeFlag strict_mode = static_cast<StrictModeFlag>(strict_unchecked);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
8002 // Setting read only property in strict mode. 7810 // Setting read only property in strict mode.
8003 Handle<Object> error = 7811 Handle<Object> error =
8004 isolate->factory()->NewTypeError( 7812 isolate->factory()->NewTypeError(
8005 "strict_cannot_assign", HandleVector(&name, 1)); 7813 "strict_cannot_assign", HandleVector(&name, 1));
8006 return isolate->Throw(*error); 7814 return isolate->Throw(*error);
8007 } 7815 }
8008 return *value; 7816 return *value;
8009 } 7817 }
8010 7818
8011 7819
8012 static MaybeObject* Runtime_Throw(RUNTIME_CALLING_CONVENTION) { 7820 RUNTIME_FUNCTION(MaybeObject*, Runtime_Throw) {
8013 RUNTIME_GET_ISOLATE;
8014 HandleScope scope(isolate); 7821 HandleScope scope(isolate);
8015 ASSERT(args.length() == 1); 7822 ASSERT(args.length() == 1);
8016 7823
8017 return isolate->Throw(args[0]); 7824 return isolate->Throw(args[0]);
8018 } 7825 }
8019 7826
8020 7827
8021 static MaybeObject* Runtime_ReThrow(RUNTIME_CALLING_CONVENTION) { 7828 RUNTIME_FUNCTION(MaybeObject*, Runtime_ReThrow) {
8022 RUNTIME_GET_ISOLATE;
8023 HandleScope scope(isolate); 7829 HandleScope scope(isolate);
8024 ASSERT(args.length() == 1); 7830 ASSERT(args.length() == 1);
8025 7831
8026 return isolate->ReThrow(args[0]); 7832 return isolate->ReThrow(args[0]);
8027 } 7833 }
8028 7834
8029 7835
8030 static MaybeObject* Runtime_PromoteScheduledException( 7836 RUNTIME_FUNCTION(MaybeObject*, Runtime_PromoteScheduledException) {
8031 RUNTIME_CALLING_CONVENTION) {
8032 RUNTIME_GET_ISOLATE;
8033 ASSERT_EQ(0, args.length()); 7837 ASSERT_EQ(0, args.length());
8034 return isolate->PromoteScheduledException(); 7838 return isolate->PromoteScheduledException();
8035 } 7839 }
8036 7840
8037 7841
8038 static MaybeObject* Runtime_ThrowReferenceError(RUNTIME_CALLING_CONVENTION) { 7842 RUNTIME_FUNCTION(MaybeObject*, Runtime_ThrowReferenceError) {
8039 RUNTIME_GET_ISOLATE;
8040 HandleScope scope(isolate); 7843 HandleScope scope(isolate);
8041 ASSERT(args.length() == 1); 7844 ASSERT(args.length() == 1);
8042 7845
8043 Handle<Object> name(args[0], isolate); 7846 Handle<Object> name(args[0], isolate);
8044 Handle<Object> reference_error = 7847 Handle<Object> reference_error =
8045 isolate->factory()->NewReferenceError("not_defined", 7848 isolate->factory()->NewReferenceError("not_defined",
8046 HandleVector(&name, 1)); 7849 HandleVector(&name, 1));
8047 return isolate->Throw(*reference_error); 7850 return isolate->Throw(*reference_error);
8048 } 7851 }
8049 7852
8050 7853
8051 static MaybeObject* Runtime_StackGuard(RUNTIME_CALLING_CONVENTION) { 7854 RUNTIME_FUNCTION(MaybeObject*, Runtime_StackGuard) {
8052 RUNTIME_GET_ISOLATE;
8053 ASSERT(args.length() == 0); 7855 ASSERT(args.length() == 0);
8054 7856
8055 // First check if this is a real stack overflow. 7857 // First check if this is a real stack overflow.
8056 if (isolate->stack_guard()->IsStackOverflow()) { 7858 if (isolate->stack_guard()->IsStackOverflow()) {
8057 NoHandleAllocation na; 7859 NoHandleAllocation na;
8058 return isolate->StackOverflow(); 7860 return isolate->StackOverflow();
8059 } 7861 }
8060 7862
8061 return Execution::HandleStackGuardInterrupt(); 7863 return Execution::HandleStackGuardInterrupt();
8062 } 7864 }
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
8141 7943
8142 } else { 7944 } else {
8143 // function result 7945 // function result
8144 PrintF("} -> "); 7946 PrintF("} -> ");
8145 PrintObject(result); 7947 PrintObject(result);
8146 PrintF("\n"); 7948 PrintF("\n");
8147 } 7949 }
8148 } 7950 }
8149 7951
8150 7952
8151 static MaybeObject* Runtime_TraceEnter(RUNTIME_CALLING_CONVENTION) { 7953 RUNTIME_FUNCTION(MaybeObject*, Runtime_TraceEnter) {
8152 RUNTIME_GET_ISOLATE;
8153 ASSERT(args.length() == 0); 7954 ASSERT(args.length() == 0);
8154 NoHandleAllocation ha; 7955 NoHandleAllocation ha;
8155 PrintTransition(NULL); 7956 PrintTransition(NULL);
8156 return isolate->heap()->undefined_value(); 7957 return isolate->heap()->undefined_value();
8157 } 7958 }
8158 7959
8159 7960
8160 static MaybeObject* Runtime_TraceExit(RUNTIME_CALLING_CONVENTION) { 7961 RUNTIME_FUNCTION(MaybeObject*, Runtime_TraceExit) {
8161 RUNTIME_GET_ISOLATE;
8162 NoHandleAllocation ha; 7962 NoHandleAllocation ha;
8163 PrintTransition(args[0]); 7963 PrintTransition(args[0]);
8164 return args[0]; // return TOS 7964 return args[0]; // return TOS
8165 } 7965 }
8166 7966
8167 7967
8168 static MaybeObject* Runtime_DebugPrint(RUNTIME_CALLING_CONVENTION) { 7968 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPrint) {
8169 RUNTIME_GET_ISOLATE;
8170 NoHandleAllocation ha; 7969 NoHandleAllocation ha;
8171 ASSERT(args.length() == 1); 7970 ASSERT(args.length() == 1);
8172 7971
8173 #ifdef DEBUG 7972 #ifdef DEBUG
8174 if (args[0]->IsString()) { 7973 if (args[0]->IsString()) {
8175 // If we have a string, assume it's a code "marker" 7974 // If we have a string, assume it's a code "marker"
8176 // and print some interesting cpu debugging info. 7975 // and print some interesting cpu debugging info.
8177 JavaScriptFrameIterator it; 7976 JavaScriptFrameIterator it;
8178 JavaScriptFrame* frame = it.frame(); 7977 JavaScriptFrame* frame = it.frame();
8179 PrintF("fp = %p, sp = %p, caller_sp = %p: ", 7978 PrintF("fp = %p, sp = %p, caller_sp = %p: ",
(...skipping 10 matching lines...) Expand all
8190 // ShortPrint is available in release mode. Print is not. 7989 // ShortPrint is available in release mode. Print is not.
8191 args[0]->ShortPrint(); 7990 args[0]->ShortPrint();
8192 #endif 7991 #endif
8193 PrintF("\n"); 7992 PrintF("\n");
8194 Flush(); 7993 Flush();
8195 7994
8196 return args[0]; // return TOS 7995 return args[0]; // return TOS
8197 } 7996 }
8198 7997
8199 7998
8200 static MaybeObject* Runtime_DebugTrace(RUNTIME_CALLING_CONVENTION) { 7999 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugTrace) {
8201 RUNTIME_GET_ISOLATE;
8202 ASSERT(args.length() == 0); 8000 ASSERT(args.length() == 0);
8203 NoHandleAllocation ha; 8001 NoHandleAllocation ha;
8204 isolate->PrintStack(); 8002 isolate->PrintStack();
8205 return isolate->heap()->undefined_value(); 8003 return isolate->heap()->undefined_value();
8206 } 8004 }
8207 8005
8208 8006
8209 static MaybeObject* Runtime_DateCurrentTime(RUNTIME_CALLING_CONVENTION) { 8007 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateCurrentTime) {
8210 RUNTIME_GET_ISOLATE;
8211 NoHandleAllocation ha; 8008 NoHandleAllocation ha;
8212 ASSERT(args.length() == 0); 8009 ASSERT(args.length() == 0);
8213 8010
8214 // According to ECMA-262, section 15.9.1, page 117, the precision of 8011 // According to ECMA-262, section 15.9.1, page 117, the precision of
8215 // the number in a Date object representing a particular instant in 8012 // the number in a Date object representing a particular instant in
8216 // time is milliseconds. Therefore, we floor the result of getting 8013 // time is milliseconds. Therefore, we floor the result of getting
8217 // the OS time. 8014 // the OS time.
8218 double millis = floor(OS::TimeCurrentMillis()); 8015 double millis = floor(OS::TimeCurrentMillis());
8219 return isolate->heap()->NumberFromDouble(millis); 8016 return isolate->heap()->NumberFromDouble(millis);
8220 } 8017 }
8221 8018
8222 8019
8223 static MaybeObject* Runtime_DateParseString(RUNTIME_CALLING_CONVENTION) { 8020 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateParseString) {
8224 RUNTIME_GET_ISOLATE;
8225 HandleScope scope(isolate); 8021 HandleScope scope(isolate);
8226 ASSERT(args.length() == 2); 8022 ASSERT(args.length() == 2);
8227 8023
8228 CONVERT_ARG_CHECKED(String, str, 0); 8024 CONVERT_ARG_CHECKED(String, str, 0);
8229 FlattenString(str); 8025 FlattenString(str);
8230 8026
8231 CONVERT_ARG_CHECKED(JSArray, output, 1); 8027 CONVERT_ARG_CHECKED(JSArray, output, 1);
8232 RUNTIME_ASSERT(output->HasFastElements()); 8028 RUNTIME_ASSERT(output->HasFastElements());
8233 8029
8234 AssertNoAllocation no_allocation; 8030 AssertNoAllocation no_allocation;
8235 8031
8236 FixedArray* output_array = FixedArray::cast(output->elements()); 8032 FixedArray* output_array = FixedArray::cast(output->elements());
8237 RUNTIME_ASSERT(output_array->length() >= DateParser::OUTPUT_SIZE); 8033 RUNTIME_ASSERT(output_array->length() >= DateParser::OUTPUT_SIZE);
8238 bool result; 8034 bool result;
8239 if (str->IsAsciiRepresentation()) { 8035 if (str->IsAsciiRepresentation()) {
8240 result = DateParser::Parse(str->ToAsciiVector(), output_array); 8036 result = DateParser::Parse(str->ToAsciiVector(), output_array);
8241 } else { 8037 } else {
8242 ASSERT(str->IsTwoByteRepresentation()); 8038 ASSERT(str->IsTwoByteRepresentation());
8243 result = DateParser::Parse(str->ToUC16Vector(), output_array); 8039 result = DateParser::Parse(str->ToUC16Vector(), output_array);
8244 } 8040 }
8245 8041
8246 if (result) { 8042 if (result) {
8247 return *output; 8043 return *output;
8248 } else { 8044 } else {
8249 return isolate->heap()->null_value(); 8045 return isolate->heap()->null_value();
8250 } 8046 }
8251 } 8047 }
8252 8048
8253 8049
8254 static MaybeObject* Runtime_DateLocalTimezone(RUNTIME_CALLING_CONVENTION) { 8050 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateLocalTimezone) {
8255 RUNTIME_GET_ISOLATE;
8256 NoHandleAllocation ha; 8051 NoHandleAllocation ha;
8257 ASSERT(args.length() == 1); 8052 ASSERT(args.length() == 1);
8258 8053
8259 CONVERT_DOUBLE_CHECKED(x, args[0]); 8054 CONVERT_DOUBLE_CHECKED(x, args[0]);
8260 const char* zone = OS::LocalTimezone(x); 8055 const char* zone = OS::LocalTimezone(x);
8261 return isolate->heap()->AllocateStringFromUtf8(CStrVector(zone)); 8056 return isolate->heap()->AllocateStringFromUtf8(CStrVector(zone));
8262 } 8057 }
8263 8058
8264 8059
8265 static MaybeObject* Runtime_DateLocalTimeOffset(RUNTIME_CALLING_CONVENTION) { 8060 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateLocalTimeOffset) {
8266 RUNTIME_GET_ISOLATE;
8267 NoHandleAllocation ha; 8061 NoHandleAllocation ha;
8268 ASSERT(args.length() == 0); 8062 ASSERT(args.length() == 0);
8269 8063
8270 return isolate->heap()->NumberFromDouble(OS::LocalTimeOffset()); 8064 return isolate->heap()->NumberFromDouble(OS::LocalTimeOffset());
8271 } 8065 }
8272 8066
8273 8067
8274 static MaybeObject* Runtime_DateDaylightSavingsOffset( 8068 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateDaylightSavingsOffset) {
8275 RUNTIME_CALLING_CONVENTION) {
8276 RUNTIME_GET_ISOLATE;
8277 NoHandleAllocation ha; 8069 NoHandleAllocation ha;
8278 ASSERT(args.length() == 1); 8070 ASSERT(args.length() == 1);
8279 8071
8280 CONVERT_DOUBLE_CHECKED(x, args[0]); 8072 CONVERT_DOUBLE_CHECKED(x, args[0]);
8281 return isolate->heap()->NumberFromDouble(OS::DaylightSavingsOffset(x)); 8073 return isolate->heap()->NumberFromDouble(OS::DaylightSavingsOffset(x));
8282 } 8074 }
8283 8075
8284 8076
8285 static MaybeObject* Runtime_GlobalReceiver(RUNTIME_CALLING_CONVENTION) { 8077 RUNTIME_FUNCTION(MaybeObject*, Runtime_GlobalReceiver) {
8286 RUNTIME_GET_ISOLATE;
8287 ASSERT(args.length() == 1); 8078 ASSERT(args.length() == 1);
8288 Object* global = args[0]; 8079 Object* global = args[0];
8289 if (!global->IsJSGlobalObject()) return isolate->heap()->null_value(); 8080 if (!global->IsJSGlobalObject()) return isolate->heap()->null_value();
8290 return JSGlobalObject::cast(global)->global_receiver(); 8081 return JSGlobalObject::cast(global)->global_receiver();
8291 } 8082 }
8292 8083
8293 8084
8294 static MaybeObject* Runtime_ParseJson(RUNTIME_CALLING_CONVENTION) { 8085 RUNTIME_FUNCTION(MaybeObject*, Runtime_ParseJson) {
8295 HandleScope scope(isolate); 8086 HandleScope scope(isolate);
8296 ASSERT_EQ(1, args.length()); 8087 ASSERT_EQ(1, args.length());
8297 CONVERT_ARG_CHECKED(String, source, 0); 8088 CONVERT_ARG_CHECKED(String, source, 0);
8298 8089
8299 Handle<Object> result = JsonParser::Parse(source); 8090 Handle<Object> result = JsonParser::Parse(source);
8300 if (result.is_null()) { 8091 if (result.is_null()) {
8301 // Syntax error or stack overflow in scanner. 8092 // Syntax error or stack overflow in scanner.
8302 ASSERT(isolate->has_pending_exception()); 8093 ASSERT(isolate->has_pending_exception());
8303 return Failure::Exception(); 8094 return Failure::Exception();
8304 } 8095 }
8305 return *result; 8096 return *result;
8306 } 8097 }
8307 8098
8308 8099
8309 static MaybeObject* Runtime_CompileString(RUNTIME_CALLING_CONVENTION) { 8100 RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileString) {
8310 RUNTIME_GET_ISOLATE;
8311 HandleScope scope(isolate); 8101 HandleScope scope(isolate);
8312 ASSERT_EQ(1, args.length()); 8102 ASSERT_EQ(1, args.length());
8313 CONVERT_ARG_CHECKED(String, source, 0); 8103 CONVERT_ARG_CHECKED(String, source, 0);
8314 8104
8315 // Compile source string in the global context. 8105 // Compile source string in the global context.
8316 Handle<Context> context(isolate->context()->global_context()); 8106 Handle<Context> context(isolate->context()->global_context());
8317 Handle<SharedFunctionInfo> shared = Compiler::CompileEval(source, 8107 Handle<SharedFunctionInfo> shared = Compiler::CompileEval(source,
8318 context, 8108 context,
8319 true, 8109 true,
8320 kNonStrictMode); 8110 kNonStrictMode);
(...skipping 18 matching lines...) Expand all
8339 isolate->context()->IsGlobalContext(), 8129 isolate->context()->IsGlobalContext(),
8340 strict_mode); 8130 strict_mode);
8341 if (shared.is_null()) return MakePair(Failure::Exception(), NULL); 8131 if (shared.is_null()) return MakePair(Failure::Exception(), NULL);
8342 Handle<JSFunction> compiled = 8132 Handle<JSFunction> compiled =
8343 isolate->factory()->NewFunctionFromSharedFunctionInfo( 8133 isolate->factory()->NewFunctionFromSharedFunctionInfo(
8344 shared, Handle<Context>(isolate->context()), NOT_TENURED); 8134 shared, Handle<Context>(isolate->context()), NOT_TENURED);
8345 return MakePair(*compiled, *receiver); 8135 return MakePair(*compiled, *receiver);
8346 } 8136 }
8347 8137
8348 8138
8349 static ObjectPair Runtime_ResolvePossiblyDirectEval( 8139 RUNTIME_FUNCTION(ObjectPair, Runtime_ResolvePossiblyDirectEval) {
8350 RUNTIME_CALLING_CONVENTION) {
8351 RUNTIME_GET_ISOLATE;
8352 ASSERT(args.length() == 4); 8140 ASSERT(args.length() == 4);
8353 8141
8354 HandleScope scope(isolate); 8142 HandleScope scope(isolate);
8355 Handle<Object> callee = args.at<Object>(0); 8143 Handle<Object> callee = args.at<Object>(0);
8356 Handle<Object> receiver; // Will be overwritten. 8144 Handle<Object> receiver; // Will be overwritten.
8357 8145
8358 // Compute the calling context. 8146 // Compute the calling context.
8359 Handle<Context> context = Handle<Context>(isolate->context(), isolate); 8147 Handle<Context> context = Handle<Context>(isolate->context(), isolate);
8360 #ifdef DEBUG 8148 #ifdef DEBUG
8361 // Make sure Isolate::context() agrees with the old code that traversed 8149 // Make sure Isolate::context() agrees with the old code that traversed
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
8417 8205
8418 ASSERT(args[3]->IsSmi()); 8206 ASSERT(args[3]->IsSmi());
8419 return CompileGlobalEval(isolate, 8207 return CompileGlobalEval(isolate,
8420 args.at<String>(1), 8208 args.at<String>(1),
8421 args.at<Object>(2), 8209 args.at<Object>(2),
8422 static_cast<StrictModeFlag>( 8210 static_cast<StrictModeFlag>(
8423 Smi::cast(args[3])->value())); 8211 Smi::cast(args[3])->value()));
8424 } 8212 }
8425 8213
8426 8214
8427 static ObjectPair Runtime_ResolvePossiblyDirectEvalNoLookup( 8215 RUNTIME_FUNCTION(ObjectPair, Runtime_ResolvePossiblyDirectEvalNoLookup) {
8428 RUNTIME_CALLING_CONVENTION) {
8429 RUNTIME_GET_ISOLATE;
8430 ASSERT(args.length() == 4); 8216 ASSERT(args.length() == 4);
8431 8217
8432 HandleScope scope(isolate); 8218 HandleScope scope(isolate);
8433 Handle<Object> callee = args.at<Object>(0); 8219 Handle<Object> callee = args.at<Object>(0);
8434 8220
8435 // 'eval' is bound in the global context, but it may have been overwritten. 8221 // 'eval' is bound in the global context, but it may have been overwritten.
8436 // Compare it to the builtin 'GlobalEval' function to make sure. 8222 // Compare it to the builtin 'GlobalEval' function to make sure.
8437 if (*callee != isolate->global_context()->global_eval_fun() || 8223 if (*callee != isolate->global_context()->global_eval_fun() ||
8438 !args[1]->IsString()) { 8224 !args[1]->IsString()) {
8439 return MakePair(*callee, 8225 return MakePair(*callee,
8440 isolate->context()->global()->global_receiver()); 8226 isolate->context()->global()->global_receiver());
8441 } 8227 }
8442 8228
8443 ASSERT(args[3]->IsSmi()); 8229 ASSERT(args[3]->IsSmi());
8444 return CompileGlobalEval(isolate, 8230 return CompileGlobalEval(isolate,
8445 args.at<String>(1), 8231 args.at<String>(1),
8446 args.at<Object>(2), 8232 args.at<Object>(2),
8447 static_cast<StrictModeFlag>( 8233 static_cast<StrictModeFlag>(
8448 Smi::cast(args[3])->value())); 8234 Smi::cast(args[3])->value()));
8449 } 8235 }
8450 8236
8451 8237
8452 static MaybeObject* Runtime_SetNewFunctionAttributes( 8238 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetNewFunctionAttributes) {
8453 RUNTIME_CALLING_CONVENTION) {
8454 RUNTIME_GET_ISOLATE;
8455 // This utility adjusts the property attributes for newly created Function 8239 // This utility adjusts the property attributes for newly created Function
8456 // object ("new Function(...)") by changing the map. 8240 // object ("new Function(...)") by changing the map.
8457 // All it does is changing the prototype property to enumerable 8241 // All it does is changing the prototype property to enumerable
8458 // as specified in ECMA262, 15.3.5.2. 8242 // as specified in ECMA262, 15.3.5.2.
8459 HandleScope scope(isolate); 8243 HandleScope scope(isolate);
8460 ASSERT(args.length() == 1); 8244 ASSERT(args.length() == 1);
8461 CONVERT_ARG_CHECKED(JSFunction, func, 0); 8245 CONVERT_ARG_CHECKED(JSFunction, func, 0);
8462 8246
8463 Handle<Map> map = func->shared()->strict_mode() 8247 Handle<Map> map = func->shared()->strict_mode()
8464 ? isolate->strict_mode_function_instance_map() 8248 ? isolate->strict_mode_function_instance_map()
8465 : isolate->function_instance_map(); 8249 : isolate->function_instance_map();
8466 8250
8467 ASSERT(func->map()->instance_type() == map->instance_type()); 8251 ASSERT(func->map()->instance_type() == map->instance_type());
8468 ASSERT(func->map()->instance_size() == map->instance_size()); 8252 ASSERT(func->map()->instance_size() == map->instance_size());
8469 func->set_map(*map); 8253 func->set_map(*map);
8470 return *func; 8254 return *func;
8471 } 8255 }
8472 8256
8473 8257
8474 static MaybeObject* Runtime_AllocateInNewSpace(RUNTIME_CALLING_CONVENTION) { 8258 RUNTIME_FUNCTION(MaybeObject*, Runtime_AllocateInNewSpace) {
8475 RUNTIME_GET_ISOLATE;
8476 // Allocate a block of memory in NewSpace (filled with a filler). 8259 // Allocate a block of memory in NewSpace (filled with a filler).
8477 // Use as fallback for allocation in generated code when NewSpace 8260 // Use as fallback for allocation in generated code when NewSpace
8478 // is full. 8261 // is full.
8479 ASSERT(args.length() == 1); 8262 ASSERT(args.length() == 1);
8480 CONVERT_ARG_CHECKED(Smi, size_smi, 0); 8263 CONVERT_ARG_CHECKED(Smi, size_smi, 0);
8481 int size = size_smi->value(); 8264 int size = size_smi->value();
8482 RUNTIME_ASSERT(IsAligned(size, kPointerSize)); 8265 RUNTIME_ASSERT(IsAligned(size, kPointerSize));
8483 RUNTIME_ASSERT(size > 0); 8266 RUNTIME_ASSERT(size > 0);
8484 Heap* heap = isolate->heap(); 8267 Heap* heap = isolate->heap();
8485 const int kMinFreeNewSpaceAfterGC = heap->InitialSemiSpaceSize() * 3/4; 8268 const int kMinFreeNewSpaceAfterGC = heap->InitialSemiSpaceSize() * 3/4;
8486 RUNTIME_ASSERT(size <= kMinFreeNewSpaceAfterGC); 8269 RUNTIME_ASSERT(size <= kMinFreeNewSpaceAfterGC);
8487 Object* allocation; 8270 Object* allocation;
8488 { MaybeObject* maybe_allocation = heap->new_space()->AllocateRaw(size); 8271 { MaybeObject* maybe_allocation = heap->new_space()->AllocateRaw(size);
8489 if (maybe_allocation->ToObject(&allocation)) { 8272 if (maybe_allocation->ToObject(&allocation)) {
8490 heap->CreateFillerObjectAt(HeapObject::cast(allocation)->address(), size); 8273 heap->CreateFillerObjectAt(HeapObject::cast(allocation)->address(), size);
8491 } 8274 }
8492 return maybe_allocation; 8275 return maybe_allocation;
8493 } 8276 }
8494 } 8277 }
8495 8278
8496 8279
8497 // Push an object unto an array of objects if it is not already in the 8280 // Push an object unto an array of objects if it is not already in the
8498 // array. Returns true if the element was pushed on the stack and 8281 // array. Returns true if the element was pushed on the stack and
8499 // false otherwise. 8282 // false otherwise.
8500 static MaybeObject* Runtime_PushIfAbsent(RUNTIME_CALLING_CONVENTION) { 8283 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushIfAbsent) {
8501 RUNTIME_GET_ISOLATE;
8502 ASSERT(args.length() == 2); 8284 ASSERT(args.length() == 2);
8503 CONVERT_CHECKED(JSArray, array, args[0]); 8285 CONVERT_CHECKED(JSArray, array, args[0]);
8504 CONVERT_CHECKED(JSObject, element, args[1]); 8286 CONVERT_CHECKED(JSObject, element, args[1]);
8505 RUNTIME_ASSERT(array->HasFastElements()); 8287 RUNTIME_ASSERT(array->HasFastElements());
8506 int length = Smi::cast(array->length())->value(); 8288 int length = Smi::cast(array->length())->value();
8507 FixedArray* elements = FixedArray::cast(array->elements()); 8289 FixedArray* elements = FixedArray::cast(array->elements());
8508 for (int i = 0; i < length; i++) { 8290 for (int i = 0; i < length; i++) {
8509 if (elements->get(i) == element) return isolate->heap()->false_value(); 8291 if (elements->get(i) == element) return isolate->heap()->false_value();
8510 } 8292 }
8511 Object* obj; 8293 Object* obj;
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
8940 return true; 8722 return true;
8941 } 8723 }
8942 8724
8943 8725
8944 /** 8726 /**
8945 * Array::concat implementation. 8727 * Array::concat implementation.
8946 * See ECMAScript 262, 15.4.4.4. 8728 * See ECMAScript 262, 15.4.4.4.
8947 * TODO(581): Fix non-compliance for very large concatenations and update to 8729 * TODO(581): Fix non-compliance for very large concatenations and update to
8948 * following the ECMAScript 5 specification. 8730 * following the ECMAScript 5 specification.
8949 */ 8731 */
8950 static MaybeObject* Runtime_ArrayConcat(RUNTIME_CALLING_CONVENTION) { 8732 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayConcat) {
8951 RUNTIME_GET_ISOLATE;
8952 ASSERT(args.length() == 1); 8733 ASSERT(args.length() == 1);
8953 HandleScope handle_scope(isolate); 8734 HandleScope handle_scope(isolate);
8954 8735
8955 CONVERT_ARG_CHECKED(JSArray, arguments, 0); 8736 CONVERT_ARG_CHECKED(JSArray, arguments, 0);
8956 int argument_count = static_cast<int>(arguments->length()->Number()); 8737 int argument_count = static_cast<int>(arguments->length()->Number());
8957 RUNTIME_ASSERT(arguments->HasFastElements()); 8738 RUNTIME_ASSERT(arguments->HasFastElements());
8958 Handle<FixedArray> elements(FixedArray::cast(arguments->elements())); 8739 Handle<FixedArray> elements(FixedArray::cast(arguments->elements()));
8959 8740
8960 // Pass 1: estimate the length and number of elements of the result. 8741 // Pass 1: estimate the length and number of elements of the result.
8961 // The actual length can be larger if any of the arguments have getters 8742 // The actual length can be larger if any of the arguments have getters
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
9029 visitor.increase_index_offset(1); 8810 visitor.increase_index_offset(1);
9030 } 8811 }
9031 } 8812 }
9032 8813
9033 return *visitor.ToArray(); 8814 return *visitor.ToArray();
9034 } 8815 }
9035 8816
9036 8817
9037 // This will not allocate (flatten the string), but it may run 8818 // This will not allocate (flatten the string), but it may run
9038 // very slowly for very deeply nested ConsStrings. For debugging use only. 8819 // very slowly for very deeply nested ConsStrings. For debugging use only.
9039 static MaybeObject* Runtime_GlobalPrint(RUNTIME_CALLING_CONVENTION) { 8820 RUNTIME_FUNCTION(MaybeObject*, Runtime_GlobalPrint) {
9040 RUNTIME_GET_ISOLATE;
9041 NoHandleAllocation ha; 8821 NoHandleAllocation ha;
9042 ASSERT(args.length() == 1); 8822 ASSERT(args.length() == 1);
9043 8823
9044 CONVERT_CHECKED(String, string, args[0]); 8824 CONVERT_CHECKED(String, string, args[0]);
9045 StringInputBuffer buffer(string); 8825 StringInputBuffer buffer(string);
9046 while (buffer.has_more()) { 8826 while (buffer.has_more()) {
9047 uint16_t character = buffer.GetNext(); 8827 uint16_t character = buffer.GetNext();
9048 PrintF("%c", character); 8828 PrintF("%c", character);
9049 } 8829 }
9050 return string; 8830 return string;
9051 } 8831 }
9052 8832
9053 // Moves all own elements of an object, that are below a limit, to positions 8833 // Moves all own elements of an object, that are below a limit, to positions
9054 // starting at zero. All undefined values are placed after non-undefined values, 8834 // starting at zero. All undefined values are placed after non-undefined values,
9055 // and are followed by non-existing element. Does not change the length 8835 // and are followed by non-existing element. Does not change the length
9056 // property. 8836 // property.
9057 // Returns the number of non-undefined elements collected. 8837 // Returns the number of non-undefined elements collected.
9058 static MaybeObject* Runtime_RemoveArrayHoles(RUNTIME_CALLING_CONVENTION) { 8838 RUNTIME_FUNCTION(MaybeObject*, Runtime_RemoveArrayHoles) {
9059 RUNTIME_GET_ISOLATE;
9060 ASSERT(args.length() == 2); 8839 ASSERT(args.length() == 2);
9061 CONVERT_CHECKED(JSObject, object, args[0]); 8840 CONVERT_CHECKED(JSObject, object, args[0]);
9062 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]); 8841 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]);
9063 return object->PrepareElementsForSort(limit); 8842 return object->PrepareElementsForSort(limit);
9064 } 8843 }
9065 8844
9066 8845
9067 // Move contents of argument 0 (an array) to argument 1 (an array) 8846 // Move contents of argument 0 (an array) to argument 1 (an array)
9068 static MaybeObject* Runtime_MoveArrayContents(RUNTIME_CALLING_CONVENTION) { 8847 RUNTIME_FUNCTION(MaybeObject*, Runtime_MoveArrayContents) {
9069 RUNTIME_GET_ISOLATE;
9070 ASSERT(args.length() == 2); 8848 ASSERT(args.length() == 2);
9071 CONVERT_CHECKED(JSArray, from, args[0]); 8849 CONVERT_CHECKED(JSArray, from, args[0]);
9072 CONVERT_CHECKED(JSArray, to, args[1]); 8850 CONVERT_CHECKED(JSArray, to, args[1]);
9073 HeapObject* new_elements = from->elements(); 8851 HeapObject* new_elements = from->elements();
9074 MaybeObject* maybe_new_map; 8852 MaybeObject* maybe_new_map;
9075 if (new_elements->map() == isolate->heap()->fixed_array_map() || 8853 if (new_elements->map() == isolate->heap()->fixed_array_map() ||
9076 new_elements->map() == isolate->heap()->fixed_cow_array_map()) { 8854 new_elements->map() == isolate->heap()->fixed_cow_array_map()) {
9077 maybe_new_map = to->map()->GetFastElementsMap(); 8855 maybe_new_map = to->map()->GetFastElementsMap();
9078 } else { 8856 } else {
9079 maybe_new_map = to->map()->GetSlowElementsMap(); 8857 maybe_new_map = to->map()->GetSlowElementsMap();
9080 } 8858 }
9081 Object* new_map; 8859 Object* new_map;
9082 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map; 8860 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map;
9083 to->set_map(Map::cast(new_map)); 8861 to->set_map(Map::cast(new_map));
9084 to->set_elements(new_elements); 8862 to->set_elements(new_elements);
9085 to->set_length(from->length()); 8863 to->set_length(from->length());
9086 Object* obj; 8864 Object* obj;
9087 { MaybeObject* maybe_obj = from->ResetElements(); 8865 { MaybeObject* maybe_obj = from->ResetElements();
9088 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 8866 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
9089 } 8867 }
9090 from->set_length(Smi::FromInt(0)); 8868 from->set_length(Smi::FromInt(0));
9091 return to; 8869 return to;
9092 } 8870 }
9093 8871
9094 8872
9095 // How many elements does this object/array have? 8873 // How many elements does this object/array have?
9096 static MaybeObject* Runtime_EstimateNumberOfElements( 8874 RUNTIME_FUNCTION(MaybeObject*, Runtime_EstimateNumberOfElements) {
9097 RUNTIME_CALLING_CONVENTION) {
9098 RUNTIME_GET_ISOLATE;
9099 ASSERT(args.length() == 1); 8875 ASSERT(args.length() == 1);
9100 CONVERT_CHECKED(JSObject, object, args[0]); 8876 CONVERT_CHECKED(JSObject, object, args[0]);
9101 HeapObject* elements = object->elements(); 8877 HeapObject* elements = object->elements();
9102 if (elements->IsDictionary()) { 8878 if (elements->IsDictionary()) {
9103 return Smi::FromInt(NumberDictionary::cast(elements)->NumberOfElements()); 8879 return Smi::FromInt(NumberDictionary::cast(elements)->NumberOfElements());
9104 } else if (object->IsJSArray()) { 8880 } else if (object->IsJSArray()) {
9105 return JSArray::cast(object)->length(); 8881 return JSArray::cast(object)->length();
9106 } else { 8882 } else {
9107 return Smi::FromInt(FixedArray::cast(elements)->length()); 8883 return Smi::FromInt(FixedArray::cast(elements)->length());
9108 } 8884 }
9109 } 8885 }
9110 8886
9111 8887
9112 static MaybeObject* Runtime_SwapElements(RUNTIME_CALLING_CONVENTION) { 8888 RUNTIME_FUNCTION(MaybeObject*, Runtime_SwapElements) {
9113 RUNTIME_GET_ISOLATE;
9114 HandleScope handle_scope(isolate); 8889 HandleScope handle_scope(isolate);
9115 8890
9116 ASSERT_EQ(3, args.length()); 8891 ASSERT_EQ(3, args.length());
9117 8892
9118 CONVERT_ARG_CHECKED(JSObject, object, 0); 8893 CONVERT_ARG_CHECKED(JSObject, object, 0);
9119 Handle<Object> key1 = args.at<Object>(1); 8894 Handle<Object> key1 = args.at<Object>(1);
9120 Handle<Object> key2 = args.at<Object>(2); 8895 Handle<Object> key2 = args.at<Object>(2);
9121 8896
9122 uint32_t index1, index2; 8897 uint32_t index1, index2;
9123 if (!key1->ToArrayIndex(&index1) 8898 if (!key1->ToArrayIndex(&index1)
(...skipping 14 matching lines...) Expand all
9138 8913
9139 return isolate->heap()->undefined_value(); 8914 return isolate->heap()->undefined_value();
9140 } 8915 }
9141 8916
9142 8917
9143 // Returns an array that tells you where in the [0, length) interval an array 8918 // Returns an array that tells you where in the [0, length) interval an array
9144 // might have elements. Can either return keys (positive integers) or 8919 // might have elements. Can either return keys (positive integers) or
9145 // intervals (pair of a negative integer (-start-1) followed by a 8920 // intervals (pair of a negative integer (-start-1) followed by a
9146 // positive (length)) or undefined values. 8921 // positive (length)) or undefined values.
9147 // Intervals can span over some keys that are not in the object. 8922 // Intervals can span over some keys that are not in the object.
9148 static MaybeObject* Runtime_GetArrayKeys(RUNTIME_CALLING_CONVENTION) { 8923 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetArrayKeys) {
9149 RUNTIME_GET_ISOLATE;
9150 ASSERT(args.length() == 2); 8924 ASSERT(args.length() == 2);
9151 HandleScope scope(isolate); 8925 HandleScope scope(isolate);
9152 CONVERT_ARG_CHECKED(JSObject, array, 0); 8926 CONVERT_ARG_CHECKED(JSObject, array, 0);
9153 CONVERT_NUMBER_CHECKED(uint32_t, length, Uint32, args[1]); 8927 CONVERT_NUMBER_CHECKED(uint32_t, length, Uint32, args[1]);
9154 if (array->elements()->IsDictionary()) { 8928 if (array->elements()->IsDictionary()) {
9155 // Create an array and get all the keys into it, then remove all the 8929 // Create an array and get all the keys into it, then remove all the
9156 // keys that are not integers in the range 0 to length-1. 8930 // keys that are not integers in the range 0 to length-1.
9157 Handle<FixedArray> keys = GetKeysInFixedArrayFor(array, INCLUDE_PROTOS); 8931 Handle<FixedArray> keys = GetKeysInFixedArrayFor(array, INCLUDE_PROTOS);
9158 int keys_length = keys->length(); 8932 int keys_length = keys->length();
9159 for (int i = 0; i < keys_length; i++) { 8933 for (int i = 0; i < keys_length; i++) {
(...skipping 19 matching lines...) Expand all
9179 return *isolate->factory()->NewJSArrayWithElements(single_interval); 8953 return *isolate->factory()->NewJSArrayWithElements(single_interval);
9180 } 8954 }
9181 } 8955 }
9182 8956
9183 8957
9184 // DefineAccessor takes an optional final argument which is the 8958 // DefineAccessor takes an optional final argument which is the
9185 // property attributes (eg, DONT_ENUM, DONT_DELETE). IMPORTANT: due 8959 // property attributes (eg, DONT_ENUM, DONT_DELETE). IMPORTANT: due
9186 // to the way accessors are implemented, it is set for both the getter 8960 // to the way accessors are implemented, it is set for both the getter
9187 // and setter on the first call to DefineAccessor and ignored on 8961 // and setter on the first call to DefineAccessor and ignored on
9188 // subsequent calls. 8962 // subsequent calls.
9189 static MaybeObject* Runtime_DefineAccessor(RUNTIME_CALLING_CONVENTION) { 8963 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineAccessor) {
9190 RUNTIME_GET_ISOLATE;
9191 RUNTIME_ASSERT(args.length() == 4 || args.length() == 5); 8964 RUNTIME_ASSERT(args.length() == 4 || args.length() == 5);
9192 // Compute attributes. 8965 // Compute attributes.
9193 PropertyAttributes attributes = NONE; 8966 PropertyAttributes attributes = NONE;
9194 if (args.length() == 5) { 8967 if (args.length() == 5) {
9195 CONVERT_CHECKED(Smi, attrs, args[4]); 8968 CONVERT_CHECKED(Smi, attrs, args[4]);
9196 int value = attrs->value(); 8969 int value = attrs->value();
9197 // Only attribute bits should be set. 8970 // Only attribute bits should be set.
9198 ASSERT((value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 8971 ASSERT((value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
9199 attributes = static_cast<PropertyAttributes>(value); 8972 attributes = static_cast<PropertyAttributes>(value);
9200 } 8973 }
9201 8974
9202 CONVERT_CHECKED(JSObject, obj, args[0]); 8975 CONVERT_CHECKED(JSObject, obj, args[0]);
9203 CONVERT_CHECKED(String, name, args[1]); 8976 CONVERT_CHECKED(String, name, args[1]);
9204 CONVERT_CHECKED(Smi, flag, args[2]); 8977 CONVERT_CHECKED(Smi, flag, args[2]);
9205 CONVERT_CHECKED(JSFunction, fun, args[3]); 8978 CONVERT_CHECKED(JSFunction, fun, args[3]);
9206 return obj->DefineAccessor(name, flag->value() == 0, fun, attributes); 8979 return obj->DefineAccessor(name, flag->value() == 0, fun, attributes);
9207 } 8980 }
9208 8981
9209 8982
9210 static MaybeObject* Runtime_LookupAccessor(RUNTIME_CALLING_CONVENTION) { 8983 RUNTIME_FUNCTION(MaybeObject*, Runtime_LookupAccessor) {
9211 RUNTIME_GET_ISOLATE;
9212 ASSERT(args.length() == 3); 8984 ASSERT(args.length() == 3);
9213 CONVERT_CHECKED(JSObject, obj, args[0]); 8985 CONVERT_CHECKED(JSObject, obj, args[0]);
9214 CONVERT_CHECKED(String, name, args[1]); 8986 CONVERT_CHECKED(String, name, args[1]);
9215 CONVERT_CHECKED(Smi, flag, args[2]); 8987 CONVERT_CHECKED(Smi, flag, args[2]);
9216 return obj->LookupAccessor(name, flag->value() == 0); 8988 return obj->LookupAccessor(name, flag->value() == 0);
9217 } 8989 }
9218 8990
9219 8991
9220 #ifdef ENABLE_DEBUGGER_SUPPORT 8992 #ifdef ENABLE_DEBUGGER_SUPPORT
9221 static MaybeObject* Runtime_DebugBreak(RUNTIME_CALLING_CONVENTION) { 8993 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugBreak) {
9222 RUNTIME_GET_ISOLATE;
9223 ASSERT(args.length() == 0); 8994 ASSERT(args.length() == 0);
9224 return Execution::DebugBreakHelper(); 8995 return Execution::DebugBreakHelper();
9225 } 8996 }
9226 8997
9227 8998
9228 // Helper functions for wrapping and unwrapping stack frame ids. 8999 // Helper functions for wrapping and unwrapping stack frame ids.
9229 static Smi* WrapFrameId(StackFrame::Id id) { 9000 static Smi* WrapFrameId(StackFrame::Id id) {
9230 ASSERT(IsAligned(OffsetFrom(id), static_cast<intptr_t>(4))); 9001 ASSERT(IsAligned(OffsetFrom(id), static_cast<intptr_t>(4)));
9231 return Smi::FromInt(id >> 2); 9002 return Smi::FromInt(id >> 2);
9232 } 9003 }
9233 9004
9234 9005
9235 static StackFrame::Id UnwrapFrameId(Smi* wrapped) { 9006 static StackFrame::Id UnwrapFrameId(Smi* wrapped) {
9236 return static_cast<StackFrame::Id>(wrapped->value() << 2); 9007 return static_cast<StackFrame::Id>(wrapped->value() << 2);
9237 } 9008 }
9238 9009
9239 9010
9240 // Adds a JavaScript function as a debug event listener. 9011 // Adds a JavaScript function as a debug event listener.
9241 // args[0]: debug event listener function to set or null or undefined for 9012 // args[0]: debug event listener function to set or null or undefined for
9242 // clearing the event listener function 9013 // clearing the event listener function
9243 // args[1]: object supplied during callback 9014 // args[1]: object supplied during callback
9244 static MaybeObject* Runtime_SetDebugEventListener(RUNTIME_CALLING_CONVENTION) { 9015 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDebugEventListener) {
9245 RUNTIME_GET_ISOLATE;
9246 ASSERT(args.length() == 2); 9016 ASSERT(args.length() == 2);
9247 RUNTIME_ASSERT(args[0]->IsJSFunction() || 9017 RUNTIME_ASSERT(args[0]->IsJSFunction() ||
9248 args[0]->IsUndefined() || 9018 args[0]->IsUndefined() ||
9249 args[0]->IsNull()); 9019 args[0]->IsNull());
9250 Handle<Object> callback = args.at<Object>(0); 9020 Handle<Object> callback = args.at<Object>(0);
9251 Handle<Object> data = args.at<Object>(1); 9021 Handle<Object> data = args.at<Object>(1);
9252 isolate->debugger()->SetEventListener(callback, data); 9022 isolate->debugger()->SetEventListener(callback, data);
9253 9023
9254 return isolate->heap()->undefined_value(); 9024 return isolate->heap()->undefined_value();
9255 } 9025 }
9256 9026
9257 9027
9258 static MaybeObject* Runtime_Break(RUNTIME_CALLING_CONVENTION) { 9028 RUNTIME_FUNCTION(MaybeObject*, Runtime_Break) {
9259 RUNTIME_GET_ISOLATE;
9260 ASSERT(args.length() == 0); 9029 ASSERT(args.length() == 0);
9261 isolate->stack_guard()->DebugBreak(); 9030 isolate->stack_guard()->DebugBreak();
9262 return isolate->heap()->undefined_value(); 9031 return isolate->heap()->undefined_value();
9263 } 9032 }
9264 9033
9265 9034
9266 static MaybeObject* DebugLookupResultValue(Heap* heap, 9035 static MaybeObject* DebugLookupResultValue(Heap* heap,
9267 Object* receiver, 9036 Object* receiver,
9268 String* name, 9037 String* name,
9269 LookupResult* result, 9038 LookupResult* result,
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
9325 // args[1]: name of the property 9094 // args[1]: name of the property
9326 // 9095 //
9327 // The array returned contains the following information: 9096 // The array returned contains the following information:
9328 // 0: Property value 9097 // 0: Property value
9329 // 1: Property details 9098 // 1: Property details
9330 // 2: Property value is exception 9099 // 2: Property value is exception
9331 // 3: Getter function if defined 9100 // 3: Getter function if defined
9332 // 4: Setter function if defined 9101 // 4: Setter function if defined
9333 // Items 2-4 are only filled if the property has either a getter or a setter 9102 // Items 2-4 are only filled if the property has either a getter or a setter
9334 // defined through __defineGetter__ and/or __defineSetter__. 9103 // defined through __defineGetter__ and/or __defineSetter__.
9335 static MaybeObject* Runtime_DebugGetPropertyDetails( 9104 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetPropertyDetails) {
9336 RUNTIME_CALLING_CONVENTION) {
9337 RUNTIME_GET_ISOLATE;
9338 HandleScope scope(isolate); 9105 HandleScope scope(isolate);
9339 9106
9340 ASSERT(args.length() == 2); 9107 ASSERT(args.length() == 2);
9341 9108
9342 CONVERT_ARG_CHECKED(JSObject, obj, 0); 9109 CONVERT_ARG_CHECKED(JSObject, obj, 0);
9343 CONVERT_ARG_CHECKED(String, name, 1); 9110 CONVERT_ARG_CHECKED(String, name, 1);
9344 9111
9345 // Make sure to set the current context to the context before the debugger was 9112 // Make sure to set the current context to the context before the debugger was
9346 // entered (if the debugger is entered). The reason for switching context here 9113 // entered (if the debugger is entered). The reason for switching context here
9347 // is that for some property lookups (accessors and interceptors) callbacks 9114 // is that for some property lookups (accessors and interceptors) callbacks
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
9427 } 9194 }
9428 if (i < length - 1) { 9195 if (i < length - 1) {
9429 jsproto = Handle<JSObject>(JSObject::cast(jsproto->GetPrototype())); 9196 jsproto = Handle<JSObject>(JSObject::cast(jsproto->GetPrototype()));
9430 } 9197 }
9431 } 9198 }
9432 9199
9433 return isolate->heap()->undefined_value(); 9200 return isolate->heap()->undefined_value();
9434 } 9201 }
9435 9202
9436 9203
9437 static MaybeObject* Runtime_DebugGetProperty(RUNTIME_CALLING_CONVENTION) { 9204 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetProperty) {
9438 RUNTIME_GET_ISOLATE;
9439 HandleScope scope(isolate); 9205 HandleScope scope(isolate);
9440 9206
9441 ASSERT(args.length() == 2); 9207 ASSERT(args.length() == 2);
9442 9208
9443 CONVERT_ARG_CHECKED(JSObject, obj, 0); 9209 CONVERT_ARG_CHECKED(JSObject, obj, 0);
9444 CONVERT_ARG_CHECKED(String, name, 1); 9210 CONVERT_ARG_CHECKED(String, name, 1);
9445 9211
9446 LookupResult result; 9212 LookupResult result;
9447 obj->Lookup(*name, &result); 9213 obj->Lookup(*name, &result);
9448 if (result.IsProperty()) { 9214 if (result.IsProperty()) {
9449 return DebugLookupResultValue(isolate->heap(), *obj, *name, &result, NULL); 9215 return DebugLookupResultValue(isolate->heap(), *obj, *name, &result, NULL);
9450 } 9216 }
9451 return isolate->heap()->undefined_value(); 9217 return isolate->heap()->undefined_value();
9452 } 9218 }
9453 9219
9454 9220
9455 // Return the property type calculated from the property details. 9221 // Return the property type calculated from the property details.
9456 // args[0]: smi with property details. 9222 // args[0]: smi with property details.
9457 static MaybeObject* Runtime_DebugPropertyTypeFromDetails( 9223 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyTypeFromDetails) {
9458 RUNTIME_CALLING_CONVENTION) {
9459 RUNTIME_GET_ISOLATE;
9460 ASSERT(args.length() == 1); 9224 ASSERT(args.length() == 1);
9461 CONVERT_CHECKED(Smi, details, args[0]); 9225 CONVERT_CHECKED(Smi, details, args[0]);
9462 PropertyType type = PropertyDetails(details).type(); 9226 PropertyType type = PropertyDetails(details).type();
9463 return Smi::FromInt(static_cast<int>(type)); 9227 return Smi::FromInt(static_cast<int>(type));
9464 } 9228 }
9465 9229
9466 9230
9467 // Return the property attribute calculated from the property details. 9231 // Return the property attribute calculated from the property details.
9468 // args[0]: smi with property details. 9232 // args[0]: smi with property details.
9469 static MaybeObject* Runtime_DebugPropertyAttributesFromDetails( 9233 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyAttributesFromDetails) {
9470 RUNTIME_CALLING_CONVENTION) {
9471 RUNTIME_GET_ISOLATE;
9472 ASSERT(args.length() == 1); 9234 ASSERT(args.length() == 1);
9473 CONVERT_CHECKED(Smi, details, args[0]); 9235 CONVERT_CHECKED(Smi, details, args[0]);
9474 PropertyAttributes attributes = PropertyDetails(details).attributes(); 9236 PropertyAttributes attributes = PropertyDetails(details).attributes();
9475 return Smi::FromInt(static_cast<int>(attributes)); 9237 return Smi::FromInt(static_cast<int>(attributes));
9476 } 9238 }
9477 9239
9478 9240
9479 // Return the property insertion index calculated from the property details. 9241 // Return the property insertion index calculated from the property details.
9480 // args[0]: smi with property details. 9242 // args[0]: smi with property details.
9481 static MaybeObject* Runtime_DebugPropertyIndexFromDetails( 9243 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyIndexFromDetails) {
9482 RUNTIME_CALLING_CONVENTION) {
9483 RUNTIME_GET_ISOLATE;
9484 ASSERT(args.length() == 1); 9244 ASSERT(args.length() == 1);
9485 CONVERT_CHECKED(Smi, details, args[0]); 9245 CONVERT_CHECKED(Smi, details, args[0]);
9486 int index = PropertyDetails(details).index(); 9246 int index = PropertyDetails(details).index();
9487 return Smi::FromInt(index); 9247 return Smi::FromInt(index);
9488 } 9248 }
9489 9249
9490 9250
9491 // Return property value from named interceptor. 9251 // Return property value from named interceptor.
9492 // args[0]: object 9252 // args[0]: object
9493 // args[1]: property name 9253 // args[1]: property name
9494 static MaybeObject* Runtime_DebugNamedInterceptorPropertyValue( 9254 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugNamedInterceptorPropertyValue) {
9495 RUNTIME_CALLING_CONVENTION) {
9496 RUNTIME_GET_ISOLATE;
9497 HandleScope scope(isolate); 9255 HandleScope scope(isolate);
9498 ASSERT(args.length() == 2); 9256 ASSERT(args.length() == 2);
9499 CONVERT_ARG_CHECKED(JSObject, obj, 0); 9257 CONVERT_ARG_CHECKED(JSObject, obj, 0);
9500 RUNTIME_ASSERT(obj->HasNamedInterceptor()); 9258 RUNTIME_ASSERT(obj->HasNamedInterceptor());
9501 CONVERT_ARG_CHECKED(String, name, 1); 9259 CONVERT_ARG_CHECKED(String, name, 1);
9502 9260
9503 PropertyAttributes attributes; 9261 PropertyAttributes attributes;
9504 return obj->GetPropertyWithInterceptor(*obj, *name, &attributes); 9262 return obj->GetPropertyWithInterceptor(*obj, *name, &attributes);
9505 } 9263 }
9506 9264
9507 9265
9508 // Return element value from indexed interceptor. 9266 // Return element value from indexed interceptor.
9509 // args[0]: object 9267 // args[0]: object
9510 // args[1]: index 9268 // args[1]: index
9511 static MaybeObject* Runtime_DebugIndexedInterceptorElementValue( 9269 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugIndexedInterceptorElementValue) {
9512 RUNTIME_CALLING_CONVENTION) {
9513 RUNTIME_GET_ISOLATE;
9514 HandleScope scope(isolate); 9270 HandleScope scope(isolate);
9515 ASSERT(args.length() == 2); 9271 ASSERT(args.length() == 2);
9516 CONVERT_ARG_CHECKED(JSObject, obj, 0); 9272 CONVERT_ARG_CHECKED(JSObject, obj, 0);
9517 RUNTIME_ASSERT(obj->HasIndexedInterceptor()); 9273 RUNTIME_ASSERT(obj->HasIndexedInterceptor());
9518 CONVERT_NUMBER_CHECKED(uint32_t, index, Uint32, args[1]); 9274 CONVERT_NUMBER_CHECKED(uint32_t, index, Uint32, args[1]);
9519 9275
9520 return obj->GetElementWithInterceptor(*obj, index); 9276 return obj->GetElementWithInterceptor(*obj, index);
9521 } 9277 }
9522 9278
9523 9279
9524 static MaybeObject* Runtime_CheckExecutionState(RUNTIME_CALLING_CONVENTION) { 9280 RUNTIME_FUNCTION(MaybeObject*, Runtime_CheckExecutionState) {
9525 RUNTIME_GET_ISOLATE;
9526 ASSERT(args.length() >= 1); 9281 ASSERT(args.length() >= 1);
9527 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 9282 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
9528 // Check that the break id is valid. 9283 // Check that the break id is valid.
9529 if (isolate->debug()->break_id() == 0 || 9284 if (isolate->debug()->break_id() == 0 ||
9530 break_id != isolate->debug()->break_id()) { 9285 break_id != isolate->debug()->break_id()) {
9531 return isolate->Throw( 9286 return isolate->Throw(
9532 isolate->heap()->illegal_execution_state_symbol()); 9287 isolate->heap()->illegal_execution_state_symbol());
9533 } 9288 }
9534 9289
9535 return isolate->heap()->true_value(); 9290 return isolate->heap()->true_value();
9536 } 9291 }
9537 9292
9538 9293
9539 static MaybeObject* Runtime_GetFrameCount(RUNTIME_CALLING_CONVENTION) { 9294 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFrameCount) {
9540 RUNTIME_GET_ISOLATE;
9541 HandleScope scope(isolate); 9295 HandleScope scope(isolate);
9542 ASSERT(args.length() == 1); 9296 ASSERT(args.length() == 1);
9543 9297
9544 // Check arguments. 9298 // Check arguments.
9545 Object* result; 9299 Object* result;
9546 { MaybeObject* maybe_result = Runtime_CheckExecutionState(args, isolate); 9300 { MaybeObject* maybe_result = Runtime_CheckExecutionState(
9301 RUNTIME_ARGUMENTS(isolate, args));
9547 if (!maybe_result->ToObject(&result)) return maybe_result; 9302 if (!maybe_result->ToObject(&result)) return maybe_result;
9548 } 9303 }
9549 9304
9550 // Count all frames which are relevant to debugging stack trace. 9305 // Count all frames which are relevant to debugging stack trace.
9551 int n = 0; 9306 int n = 0;
9552 StackFrame::Id id = isolate->debug()->break_frame_id(); 9307 StackFrame::Id id = isolate->debug()->break_frame_id();
9553 if (id == StackFrame::NO_ID) { 9308 if (id == StackFrame::NO_ID) {
9554 // If there is no JavaScript stack frame count is 0. 9309 // If there is no JavaScript stack frame count is 0.
9555 return Smi::FromInt(0); 9310 return Smi::FromInt(0);
9556 } 9311 }
(...skipping 23 matching lines...) Expand all
9580 // 2: Function 9335 // 2: Function
9581 // 3: Argument count 9336 // 3: Argument count
9582 // 4: Local count 9337 // 4: Local count
9583 // 5: Source position 9338 // 5: Source position
9584 // 6: Constructor call 9339 // 6: Constructor call
9585 // 7: Is at return 9340 // 7: Is at return
9586 // 8: Debugger frame 9341 // 8: Debugger frame
9587 // Arguments name, value 9342 // Arguments name, value
9588 // Locals name, value 9343 // Locals name, value
9589 // Return value if any 9344 // Return value if any
9590 static MaybeObject* Runtime_GetFrameDetails(RUNTIME_CALLING_CONVENTION) { 9345 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFrameDetails) {
9591 RUNTIME_GET_ISOLATE;
9592 HandleScope scope(isolate); 9346 HandleScope scope(isolate);
9593 ASSERT(args.length() == 2); 9347 ASSERT(args.length() == 2);
9594 9348
9595 // Check arguments. 9349 // Check arguments.
9596 Object* check; 9350 Object* check;
9597 { MaybeObject* maybe_check = Runtime_CheckExecutionState(args, isolate); 9351 { MaybeObject* maybe_check = Runtime_CheckExecutionState(
9352 RUNTIME_ARGUMENTS(isolate, args));
9598 if (!maybe_check->ToObject(&check)) return maybe_check; 9353 if (!maybe_check->ToObject(&check)) return maybe_check;
9599 } 9354 }
9600 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); 9355 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]);
9601 Heap* heap = isolate->heap(); 9356 Heap* heap = isolate->heap();
9602 9357
9603 // Find the relevant frame with the requested index. 9358 // Find the relevant frame with the requested index.
9604 StackFrame::Id id = isolate->debug()->break_frame_id(); 9359 StackFrame::Id id = isolate->debug()->break_frame_id();
9605 if (id == StackFrame::NO_ID) { 9360 if (id == StackFrame::NO_ID) {
9606 // If there are no JavaScript stack frames return undefined. 9361 // If there are no JavaScript stack frames return undefined.
9607 return heap->undefined_value(); 9362 return heap->undefined_value();
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after
10204 JavaScriptFrame* frame_; 9959 JavaScriptFrame* frame_;
10205 Handle<JSFunction> function_; 9960 Handle<JSFunction> function_;
10206 Handle<Context> context_; 9961 Handle<Context> context_;
10207 bool local_done_; 9962 bool local_done_;
10208 bool at_local_; 9963 bool at_local_;
10209 9964
10210 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeIterator); 9965 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeIterator);
10211 }; 9966 };
10212 9967
10213 9968
10214 static MaybeObject* Runtime_GetScopeCount(RUNTIME_CALLING_CONVENTION) { 9969 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeCount) {
10215 RUNTIME_GET_ISOLATE;
10216 HandleScope scope(isolate); 9970 HandleScope scope(isolate);
10217 ASSERT(args.length() == 2); 9971 ASSERT(args.length() == 2);
10218 9972
10219 // Check arguments. 9973 // Check arguments.
10220 Object* check; 9974 Object* check;
10221 { MaybeObject* maybe_check = Runtime_CheckExecutionState(args, isolate); 9975 { MaybeObject* maybe_check = Runtime_CheckExecutionState(
9976 RUNTIME_ARGUMENTS(isolate, args));
10222 if (!maybe_check->ToObject(&check)) return maybe_check; 9977 if (!maybe_check->ToObject(&check)) return maybe_check;
10223 } 9978 }
10224 CONVERT_CHECKED(Smi, wrapped_id, args[1]); 9979 CONVERT_CHECKED(Smi, wrapped_id, args[1]);
10225 9980
10226 // Get the frame where the debugging is performed. 9981 // Get the frame where the debugging is performed.
10227 StackFrame::Id id = UnwrapFrameId(wrapped_id); 9982 StackFrame::Id id = UnwrapFrameId(wrapped_id);
10228 JavaScriptFrameIterator it(id); 9983 JavaScriptFrameIterator it(id);
10229 JavaScriptFrame* frame = it.frame(); 9984 JavaScriptFrame* frame = it.frame();
10230 9985
10231 // Count the visible scopes. 9986 // Count the visible scopes.
(...skipping 11 matching lines...) Expand all
10243 static const int kScopeDetailsSize = 2; 9998 static const int kScopeDetailsSize = 2;
10244 9999
10245 // Return an array with scope details 10000 // Return an array with scope details
10246 // args[0]: number: break id 10001 // args[0]: number: break id
10247 // args[1]: number: frame index 10002 // args[1]: number: frame index
10248 // args[2]: number: scope index 10003 // args[2]: number: scope index
10249 // 10004 //
10250 // The array returned contains the following information: 10005 // The array returned contains the following information:
10251 // 0: Scope type 10006 // 0: Scope type
10252 // 1: Scope object 10007 // 1: Scope object
10253 static MaybeObject* Runtime_GetScopeDetails(RUNTIME_CALLING_CONVENTION) { 10008 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeDetails) {
10254 RUNTIME_GET_ISOLATE;
10255 HandleScope scope(isolate); 10009 HandleScope scope(isolate);
10256 ASSERT(args.length() == 3); 10010 ASSERT(args.length() == 3);
10257 10011
10258 // Check arguments. 10012 // Check arguments.
10259 Object* check; 10013 Object* check;
10260 { MaybeObject* maybe_check = Runtime_CheckExecutionState(args, isolate); 10014 { MaybeObject* maybe_check = Runtime_CheckExecutionState(
10015 RUNTIME_ARGUMENTS(isolate, args));
10261 if (!maybe_check->ToObject(&check)) return maybe_check; 10016 if (!maybe_check->ToObject(&check)) return maybe_check;
10262 } 10017 }
10263 CONVERT_CHECKED(Smi, wrapped_id, args[1]); 10018 CONVERT_CHECKED(Smi, wrapped_id, args[1]);
10264 CONVERT_NUMBER_CHECKED(int, index, Int32, args[2]); 10019 CONVERT_NUMBER_CHECKED(int, index, Int32, args[2]);
10265 10020
10266 // Get the frame where the debugging is performed. 10021 // Get the frame where the debugging is performed.
10267 StackFrame::Id id = UnwrapFrameId(wrapped_id); 10022 StackFrame::Id id = UnwrapFrameId(wrapped_id);
10268 JavaScriptFrameIterator frame_it(id); 10023 JavaScriptFrameIterator frame_it(id);
10269 JavaScriptFrame* frame = frame_it.frame(); 10024 JavaScriptFrame* frame = frame_it.frame();
10270 10025
(...skipping 14 matching lines...) Expand all
10285 // Fill in scope details. 10040 // Fill in scope details.
10286 details->set(kScopeDetailsTypeIndex, Smi::FromInt(it.Type())); 10041 details->set(kScopeDetailsTypeIndex, Smi::FromInt(it.Type()));
10287 Handle<JSObject> scope_object = it.ScopeObject(); 10042 Handle<JSObject> scope_object = it.ScopeObject();
10288 RETURN_IF_EMPTY_HANDLE(isolate, scope_object); 10043 RETURN_IF_EMPTY_HANDLE(isolate, scope_object);
10289 details->set(kScopeDetailsObjectIndex, *scope_object); 10044 details->set(kScopeDetailsObjectIndex, *scope_object);
10290 10045
10291 return *isolate->factory()->NewJSArrayWithElements(details); 10046 return *isolate->factory()->NewJSArrayWithElements(details);
10292 } 10047 }
10293 10048
10294 10049
10295 static MaybeObject* Runtime_DebugPrintScopes(RUNTIME_CALLING_CONVENTION) { 10050 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPrintScopes) {
10296 RUNTIME_GET_ISOLATE;
10297 HandleScope scope(isolate); 10051 HandleScope scope(isolate);
10298 ASSERT(args.length() == 0); 10052 ASSERT(args.length() == 0);
10299 10053
10300 #ifdef DEBUG 10054 #ifdef DEBUG
10301 // Print the scopes for the top frame. 10055 // Print the scopes for the top frame.
10302 StackFrameLocator locator; 10056 StackFrameLocator locator;
10303 JavaScriptFrame* frame = locator.FindJavaScriptFrame(0); 10057 JavaScriptFrame* frame = locator.FindJavaScriptFrame(0);
10304 for (ScopeIterator it(isolate, frame); !it.Done(); it.Next()) { 10058 for (ScopeIterator it(isolate, frame); !it.Done(); it.Next()) {
10305 it.DebugPrint(); 10059 it.DebugPrint();
10306 } 10060 }
10307 #endif 10061 #endif
10308 return isolate->heap()->undefined_value(); 10062 return isolate->heap()->undefined_value();
10309 } 10063 }
10310 10064
10311 10065
10312 static MaybeObject* Runtime_GetThreadCount(RUNTIME_CALLING_CONVENTION) { 10066 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetThreadCount) {
10313 RUNTIME_GET_ISOLATE;
10314 HandleScope scope(isolate); 10067 HandleScope scope(isolate);
10315 ASSERT(args.length() == 1); 10068 ASSERT(args.length() == 1);
10316 10069
10317 // Check arguments. 10070 // Check arguments.
10318 Object* result; 10071 Object* result;
10319 { MaybeObject* maybe_result = Runtime_CheckExecutionState(args, isolate); 10072 { MaybeObject* maybe_result = Runtime_CheckExecutionState(
10073 RUNTIME_ARGUMENTS(isolate, args));
10320 if (!maybe_result->ToObject(&result)) return maybe_result; 10074 if (!maybe_result->ToObject(&result)) return maybe_result;
10321 } 10075 }
10322 10076
10323 // Count all archived V8 threads. 10077 // Count all archived V8 threads.
10324 int n = 0; 10078 int n = 0;
10325 for (ThreadState* thread = 10079 for (ThreadState* thread =
10326 isolate->thread_manager()->FirstThreadStateInUse(); 10080 isolate->thread_manager()->FirstThreadStateInUse();
10327 thread != NULL; 10081 thread != NULL;
10328 thread = thread->Next()) { 10082 thread = thread->Next()) {
10329 n++; 10083 n++;
10330 } 10084 }
10331 10085
10332 // Total number of threads is current thread and archived threads. 10086 // Total number of threads is current thread and archived threads.
10333 return Smi::FromInt(n + 1); 10087 return Smi::FromInt(n + 1);
10334 } 10088 }
10335 10089
10336 10090
10337 static const int kThreadDetailsCurrentThreadIndex = 0; 10091 static const int kThreadDetailsCurrentThreadIndex = 0;
10338 static const int kThreadDetailsThreadIdIndex = 1; 10092 static const int kThreadDetailsThreadIdIndex = 1;
10339 static const int kThreadDetailsSize = 2; 10093 static const int kThreadDetailsSize = 2;
10340 10094
10341 // Return an array with thread details 10095 // Return an array with thread details
10342 // args[0]: number: break id 10096 // args[0]: number: break id
10343 // args[1]: number: thread index 10097 // args[1]: number: thread index
10344 // 10098 //
10345 // The array returned contains the following information: 10099 // The array returned contains the following information:
10346 // 0: Is current thread? 10100 // 0: Is current thread?
10347 // 1: Thread id 10101 // 1: Thread id
10348 static MaybeObject* Runtime_GetThreadDetails(RUNTIME_CALLING_CONVENTION) { 10102 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetThreadDetails) {
10349 RUNTIME_GET_ISOLATE;
10350 HandleScope scope(isolate); 10103 HandleScope scope(isolate);
10351 ASSERT(args.length() == 2); 10104 ASSERT(args.length() == 2);
10352 10105
10353 // Check arguments. 10106 // Check arguments.
10354 Object* check; 10107 Object* check;
10355 { MaybeObject* maybe_check = Runtime_CheckExecutionState(args, isolate); 10108 { MaybeObject* maybe_check = Runtime_CheckExecutionState(
10109 RUNTIME_ARGUMENTS(isolate, args));
10356 if (!maybe_check->ToObject(&check)) return maybe_check; 10110 if (!maybe_check->ToObject(&check)) return maybe_check;
10357 } 10111 }
10358 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); 10112 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]);
10359 10113
10360 // Allocate array for result. 10114 // Allocate array for result.
10361 Handle<FixedArray> details = 10115 Handle<FixedArray> details =
10362 isolate->factory()->NewFixedArray(kThreadDetailsSize); 10116 isolate->factory()->NewFixedArray(kThreadDetailsSize);
10363 10117
10364 // Thread index 0 is current thread. 10118 // Thread index 0 is current thread.
10365 if (index == 0) { 10119 if (index == 0) {
(...skipping 22 matching lines...) Expand all
10388 details->set(kThreadDetailsThreadIdIndex, Smi::FromInt(thread->id())); 10142 details->set(kThreadDetailsThreadIdIndex, Smi::FromInt(thread->id()));
10389 } 10143 }
10390 10144
10391 // Convert to JS array and return. 10145 // Convert to JS array and return.
10392 return *isolate->factory()->NewJSArrayWithElements(details); 10146 return *isolate->factory()->NewJSArrayWithElements(details);
10393 } 10147 }
10394 10148
10395 10149
10396 // Sets the disable break state 10150 // Sets the disable break state
10397 // args[0]: disable break state 10151 // args[0]: disable break state
10398 static MaybeObject* Runtime_SetDisableBreak(RUNTIME_CALLING_CONVENTION) { 10152 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDisableBreak) {
10399 RUNTIME_GET_ISOLATE;
10400 HandleScope scope(isolate); 10153 HandleScope scope(isolate);
10401 ASSERT(args.length() == 1); 10154 ASSERT(args.length() == 1);
10402 CONVERT_BOOLEAN_CHECKED(disable_break, args[0]); 10155 CONVERT_BOOLEAN_CHECKED(disable_break, args[0]);
10403 isolate->debug()->set_disable_break(disable_break); 10156 isolate->debug()->set_disable_break(disable_break);
10404 return isolate->heap()->undefined_value(); 10157 return isolate->heap()->undefined_value();
10405 } 10158 }
10406 10159
10407 10160
10408 static MaybeObject* Runtime_GetBreakLocations(RUNTIME_CALLING_CONVENTION) { 10161 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetBreakLocations) {
10409 RUNTIME_GET_ISOLATE;
10410 HandleScope scope(isolate); 10162 HandleScope scope(isolate);
10411 ASSERT(args.length() == 1); 10163 ASSERT(args.length() == 1);
10412 10164
10413 CONVERT_ARG_CHECKED(JSFunction, fun, 0); 10165 CONVERT_ARG_CHECKED(JSFunction, fun, 0);
10414 Handle<SharedFunctionInfo> shared(fun->shared()); 10166 Handle<SharedFunctionInfo> shared(fun->shared());
10415 // Find the number of break points 10167 // Find the number of break points
10416 Handle<Object> break_locations = Debug::GetSourceBreakLocations(shared); 10168 Handle<Object> break_locations = Debug::GetSourceBreakLocations(shared);
10417 if (break_locations->IsUndefined()) return isolate->heap()->undefined_value(); 10169 if (break_locations->IsUndefined()) return isolate->heap()->undefined_value();
10418 // Return array as JS array 10170 // Return array as JS array
10419 return *isolate->factory()->NewJSArrayWithElements( 10171 return *isolate->factory()->NewJSArrayWithElements(
10420 Handle<FixedArray>::cast(break_locations)); 10172 Handle<FixedArray>::cast(break_locations));
10421 } 10173 }
10422 10174
10423 10175
10424 // Set a break point in a function 10176 // Set a break point in a function
10425 // args[0]: function 10177 // args[0]: function
10426 // args[1]: number: break source position (within the function source) 10178 // args[1]: number: break source position (within the function source)
10427 // args[2]: number: break point object 10179 // args[2]: number: break point object
10428 static MaybeObject* Runtime_SetFunctionBreakPoint(RUNTIME_CALLING_CONVENTION) { 10180 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetFunctionBreakPoint) {
10429 RUNTIME_GET_ISOLATE;
10430 HandleScope scope(isolate); 10181 HandleScope scope(isolate);
10431 ASSERT(args.length() == 3); 10182 ASSERT(args.length() == 3);
10432 CONVERT_ARG_CHECKED(JSFunction, fun, 0); 10183 CONVERT_ARG_CHECKED(JSFunction, fun, 0);
10433 Handle<SharedFunctionInfo> shared(fun->shared()); 10184 Handle<SharedFunctionInfo> shared(fun->shared());
10434 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); 10185 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]);
10435 RUNTIME_ASSERT(source_position >= 0); 10186 RUNTIME_ASSERT(source_position >= 0);
10436 Handle<Object> break_point_object_arg = args.at<Object>(2); 10187 Handle<Object> break_point_object_arg = args.at<Object>(2);
10437 10188
10438 // Set break point. 10189 // Set break point.
10439 isolate->debug()->SetBreakPoint(shared, break_point_object_arg, 10190 isolate->debug()->SetBreakPoint(shared, break_point_object_arg,
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
10520 return *target; 10271 return *target;
10521 } 10272 }
10522 10273
10523 10274
10524 // Changes the state of a break point in a script and returns source position 10275 // Changes the state of a break point in a script and returns source position
10525 // where break point was set. NOTE: Regarding performance see the NOTE for 10276 // where break point was set. NOTE: Regarding performance see the NOTE for
10526 // GetScriptFromScriptData. 10277 // GetScriptFromScriptData.
10527 // args[0]: script to set break point in 10278 // args[0]: script to set break point in
10528 // args[1]: number: break source position (within the script source) 10279 // args[1]: number: break source position (within the script source)
10529 // args[2]: number: break point object 10280 // args[2]: number: break point object
10530 static MaybeObject* Runtime_SetScriptBreakPoint(RUNTIME_CALLING_CONVENTION) { 10281 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetScriptBreakPoint) {
10531 RUNTIME_GET_ISOLATE;
10532 HandleScope scope(isolate); 10282 HandleScope scope(isolate);
10533 ASSERT(args.length() == 3); 10283 ASSERT(args.length() == 3);
10534 CONVERT_ARG_CHECKED(JSValue, wrapper, 0); 10284 CONVERT_ARG_CHECKED(JSValue, wrapper, 0);
10535 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); 10285 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]);
10536 RUNTIME_ASSERT(source_position >= 0); 10286 RUNTIME_ASSERT(source_position >= 0);
10537 Handle<Object> break_point_object_arg = args.at<Object>(2); 10287 Handle<Object> break_point_object_arg = args.at<Object>(2);
10538 10288
10539 // Get the script from the script wrapper. 10289 // Get the script from the script wrapper.
10540 RUNTIME_ASSERT(wrapper->value()->IsScript()); 10290 RUNTIME_ASSERT(wrapper->value()->IsScript());
10541 Handle<Script> script(Script::cast(wrapper->value())); 10291 Handle<Script> script(Script::cast(wrapper->value()));
(...skipping 13 matching lines...) Expand all
10555 isolate->debug()->SetBreakPoint(shared, break_point_object_arg, &position); 10305 isolate->debug()->SetBreakPoint(shared, break_point_object_arg, &position);
10556 position += shared->start_position(); 10306 position += shared->start_position();
10557 return Smi::FromInt(position); 10307 return Smi::FromInt(position);
10558 } 10308 }
10559 return isolate->heap()->undefined_value(); 10309 return isolate->heap()->undefined_value();
10560 } 10310 }
10561 10311
10562 10312
10563 // Clear a break point 10313 // Clear a break point
10564 // args[0]: number: break point object 10314 // args[0]: number: break point object
10565 static MaybeObject* Runtime_ClearBreakPoint(RUNTIME_CALLING_CONVENTION) { 10315 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClearBreakPoint) {
10566 RUNTIME_GET_ISOLATE;
10567 HandleScope scope(isolate); 10316 HandleScope scope(isolate);
10568 ASSERT(args.length() == 1); 10317 ASSERT(args.length() == 1);
10569 Handle<Object> break_point_object_arg = args.at<Object>(0); 10318 Handle<Object> break_point_object_arg = args.at<Object>(0);
10570 10319
10571 // Clear break point. 10320 // Clear break point.
10572 isolate->debug()->ClearBreakPoint(break_point_object_arg); 10321 isolate->debug()->ClearBreakPoint(break_point_object_arg);
10573 10322
10574 return isolate->heap()->undefined_value(); 10323 return isolate->heap()->undefined_value();
10575 } 10324 }
10576 10325
10577 10326
10578 // Change the state of break on exceptions. 10327 // Change the state of break on exceptions.
10579 // args[0]: Enum value indicating whether to affect caught/uncaught exceptions. 10328 // args[0]: Enum value indicating whether to affect caught/uncaught exceptions.
10580 // args[1]: Boolean indicating on/off. 10329 // args[1]: Boolean indicating on/off.
10581 static MaybeObject* Runtime_ChangeBreakOnException(RUNTIME_CALLING_CONVENTION) { 10330 RUNTIME_FUNCTION(MaybeObject*, Runtime_ChangeBreakOnException) {
10582 RUNTIME_GET_ISOLATE;
10583 HandleScope scope(isolate); 10331 HandleScope scope(isolate);
10584 ASSERT(args.length() == 2); 10332 ASSERT(args.length() == 2);
10585 RUNTIME_ASSERT(args[0]->IsNumber()); 10333 RUNTIME_ASSERT(args[0]->IsNumber());
10586 CONVERT_BOOLEAN_CHECKED(enable, args[1]); 10334 CONVERT_BOOLEAN_CHECKED(enable, args[1]);
10587 10335
10588 // If the number doesn't match an enum value, the ChangeBreakOnException 10336 // If the number doesn't match an enum value, the ChangeBreakOnException
10589 // function will default to affecting caught exceptions. 10337 // function will default to affecting caught exceptions.
10590 ExceptionBreakType type = 10338 ExceptionBreakType type =
10591 static_cast<ExceptionBreakType>(NumberToUint32(args[0])); 10339 static_cast<ExceptionBreakType>(NumberToUint32(args[0]));
10592 // Update break point state. 10340 // Update break point state.
10593 isolate->debug()->ChangeBreakOnException(type, enable); 10341 isolate->debug()->ChangeBreakOnException(type, enable);
10594 return isolate->heap()->undefined_value(); 10342 return isolate->heap()->undefined_value();
10595 } 10343 }
10596 10344
10597 10345
10598 // Returns the state of break on exceptions 10346 // Returns the state of break on exceptions
10599 // args[0]: boolean indicating uncaught exceptions 10347 // args[0]: boolean indicating uncaught exceptions
10600 static MaybeObject* Runtime_IsBreakOnException(RUNTIME_CALLING_CONVENTION) { 10348 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsBreakOnException) {
10601 RUNTIME_GET_ISOLATE;
10602 HandleScope scope(isolate); 10349 HandleScope scope(isolate);
10603 ASSERT(args.length() == 1); 10350 ASSERT(args.length() == 1);
10604 RUNTIME_ASSERT(args[0]->IsNumber()); 10351 RUNTIME_ASSERT(args[0]->IsNumber());
10605 10352
10606 ExceptionBreakType type = 10353 ExceptionBreakType type =
10607 static_cast<ExceptionBreakType>(NumberToUint32(args[0])); 10354 static_cast<ExceptionBreakType>(NumberToUint32(args[0]));
10608 bool result = isolate->debug()->IsBreakOnException(type); 10355 bool result = isolate->debug()->IsBreakOnException(type);
10609 return Smi::FromInt(result); 10356 return Smi::FromInt(result);
10610 } 10357 }
10611 10358
10612 10359
10613 // Prepare for stepping 10360 // Prepare for stepping
10614 // args[0]: break id for checking execution state 10361 // args[0]: break id for checking execution state
10615 // args[1]: step action from the enumeration StepAction 10362 // args[1]: step action from the enumeration StepAction
10616 // args[2]: number of times to perform the step, for step out it is the number 10363 // args[2]: number of times to perform the step, for step out it is the number
10617 // of frames to step down. 10364 // of frames to step down.
10618 static MaybeObject* Runtime_PrepareStep(RUNTIME_CALLING_CONVENTION) { 10365 RUNTIME_FUNCTION(MaybeObject*, Runtime_PrepareStep) {
10619 RUNTIME_GET_ISOLATE;
10620 HandleScope scope(isolate); 10366 HandleScope scope(isolate);
10621 ASSERT(args.length() == 3); 10367 ASSERT(args.length() == 3);
10622 // Check arguments. 10368 // Check arguments.
10623 Object* check; 10369 Object* check;
10624 { MaybeObject* maybe_check = Runtime_CheckExecutionState(args, isolate); 10370 { MaybeObject* maybe_check = Runtime_CheckExecutionState(
10371 RUNTIME_ARGUMENTS(isolate, args));
10625 if (!maybe_check->ToObject(&check)) return maybe_check; 10372 if (!maybe_check->ToObject(&check)) return maybe_check;
10626 } 10373 }
10627 if (!args[1]->IsNumber() || !args[2]->IsNumber()) { 10374 if (!args[1]->IsNumber() || !args[2]->IsNumber()) {
10628 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); 10375 return isolate->Throw(isolate->heap()->illegal_argument_symbol());
10629 } 10376 }
10630 10377
10631 // Get the step action and check validity. 10378 // Get the step action and check validity.
10632 StepAction step_action = static_cast<StepAction>(NumberToInt32(args[1])); 10379 StepAction step_action = static_cast<StepAction>(NumberToInt32(args[1]));
10633 if (step_action != StepIn && 10380 if (step_action != StepIn &&
10634 step_action != StepNext && 10381 step_action != StepNext &&
(...skipping 13 matching lines...) Expand all
10648 isolate->debug()->ClearStepping(); 10395 isolate->debug()->ClearStepping();
10649 10396
10650 // Prepare step. 10397 // Prepare step.
10651 isolate->debug()->PrepareStep(static_cast<StepAction>(step_action), 10398 isolate->debug()->PrepareStep(static_cast<StepAction>(step_action),
10652 step_count); 10399 step_count);
10653 return isolate->heap()->undefined_value(); 10400 return isolate->heap()->undefined_value();
10654 } 10401 }
10655 10402
10656 10403
10657 // Clear all stepping set by PrepareStep. 10404 // Clear all stepping set by PrepareStep.
10658 static MaybeObject* Runtime_ClearStepping(RUNTIME_CALLING_CONVENTION) { 10405 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClearStepping) {
10659 RUNTIME_GET_ISOLATE;
10660 HandleScope scope(isolate); 10406 HandleScope scope(isolate);
10661 ASSERT(args.length() == 0); 10407 ASSERT(args.length() == 0);
10662 isolate->debug()->ClearStepping(); 10408 isolate->debug()->ClearStepping();
10663 return isolate->heap()->undefined_value(); 10409 return isolate->heap()->undefined_value();
10664 } 10410 }
10665 10411
10666 10412
10667 // Creates a copy of the with context chain. The copy of the context chain is 10413 // Creates a copy of the with context chain. The copy of the context chain is
10668 // is linked to the function context supplied. 10414 // is linked to the function context supplied.
10669 static Handle<Context> CopyWithContextChain(Handle<Context> context_chain, 10415 static Handle<Context> CopyWithContextChain(Handle<Context> context_chain,
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
10732 // debugging. This is accomplished by creating a new context which in its 10478 // debugging. This is accomplished by creating a new context which in its
10733 // extension part has all the parameters and locals of the function on the 10479 // extension part has all the parameters and locals of the function on the
10734 // stack frame. A function which calls eval with the code to evaluate is then 10480 // stack frame. A function which calls eval with the code to evaluate is then
10735 // compiled in this context and called in this context. As this context 10481 // compiled in this context and called in this context. As this context
10736 // replaces the context of the function on the stack frame a new (empty) 10482 // replaces the context of the function on the stack frame a new (empty)
10737 // function is created as well to be used as the closure for the context. 10483 // function is created as well to be used as the closure for the context.
10738 // This function and the context acts as replacements for the function on the 10484 // This function and the context acts as replacements for the function on the
10739 // stack frame presenting the same view of the values of parameters and 10485 // stack frame presenting the same view of the values of parameters and
10740 // local variables as if the piece of JavaScript was evaluated at the point 10486 // local variables as if the piece of JavaScript was evaluated at the point
10741 // where the function on the stack frame is currently stopped. 10487 // where the function on the stack frame is currently stopped.
10742 static MaybeObject* Runtime_DebugEvaluate(RUNTIME_CALLING_CONVENTION) { 10488 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugEvaluate) {
10743 RUNTIME_GET_ISOLATE;
10744 HandleScope scope(isolate); 10489 HandleScope scope(isolate);
10745 10490
10746 // Check the execution state and decode arguments frame and source to be 10491 // Check the execution state and decode arguments frame and source to be
10747 // evaluated. 10492 // evaluated.
10748 ASSERT(args.length() == 5); 10493 ASSERT(args.length() == 5);
10749 Object* check_result; 10494 Object* check_result;
10750 { MaybeObject* maybe_check_result = Runtime_CheckExecutionState(args, 10495 { MaybeObject* maybe_check_result = Runtime_CheckExecutionState(
10751 isolate); 10496 RUNTIME_ARGUMENTS(isolate, args));
10752 if (!maybe_check_result->ToObject(&check_result)) { 10497 if (!maybe_check_result->ToObject(&check_result)) {
10753 return maybe_check_result; 10498 return maybe_check_result;
10754 } 10499 }
10755 } 10500 }
10756 CONVERT_CHECKED(Smi, wrapped_id, args[1]); 10501 CONVERT_CHECKED(Smi, wrapped_id, args[1]);
10757 CONVERT_ARG_CHECKED(String, source, 2); 10502 CONVERT_ARG_CHECKED(String, source, 2);
10758 CONVERT_BOOLEAN_CHECKED(disable_break, args[3]); 10503 CONVERT_BOOLEAN_CHECKED(disable_break, args[3]);
10759 Handle<Object> additional_context(args[4]); 10504 Handle<Object> additional_context(args[4]);
10760 10505
10761 // Handle the processing of break. 10506 // Handle the processing of break.
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
10860 // Skip the global proxy as it has no properties and always delegates to the 10605 // Skip the global proxy as it has no properties and always delegates to the
10861 // real global object. 10606 // real global object.
10862 if (result->IsJSGlobalProxy()) { 10607 if (result->IsJSGlobalProxy()) {
10863 result = Handle<JSObject>(JSObject::cast(result->GetPrototype())); 10608 result = Handle<JSObject>(JSObject::cast(result->GetPrototype()));
10864 } 10609 }
10865 10610
10866 return *result; 10611 return *result;
10867 } 10612 }
10868 10613
10869 10614
10870 static MaybeObject* Runtime_DebugEvaluateGlobal(RUNTIME_CALLING_CONVENTION) { 10615 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugEvaluateGlobal) {
10871 RUNTIME_GET_ISOLATE;
10872 HandleScope scope(isolate); 10616 HandleScope scope(isolate);
10873 10617
10874 // Check the execution state and decode arguments frame and source to be 10618 // Check the execution state and decode arguments frame and source to be
10875 // evaluated. 10619 // evaluated.
10876 ASSERT(args.length() == 4); 10620 ASSERT(args.length() == 4);
10877 Object* check_result; 10621 Object* check_result;
10878 { MaybeObject* maybe_check_result = Runtime_CheckExecutionState(args, 10622 { MaybeObject* maybe_check_result = Runtime_CheckExecutionState(
10879 isolate); 10623 RUNTIME_ARGUMENTS(isolate, args));
10880 if (!maybe_check_result->ToObject(&check_result)) { 10624 if (!maybe_check_result->ToObject(&check_result)) {
10881 return maybe_check_result; 10625 return maybe_check_result;
10882 } 10626 }
10883 } 10627 }
10884 CONVERT_ARG_CHECKED(String, source, 1); 10628 CONVERT_ARG_CHECKED(String, source, 1);
10885 CONVERT_BOOLEAN_CHECKED(disable_break, args[2]); 10629 CONVERT_BOOLEAN_CHECKED(disable_break, args[2]);
10886 Handle<Object> additional_context(args[3]); 10630 Handle<Object> additional_context(args[3]);
10887 10631
10888 // Handle the processing of break. 10632 // Handle the processing of break.
10889 DisableBreak disable_break_save(disable_break); 10633 DisableBreak disable_break_save(disable_break);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
10932 bool has_pending_exception; 10676 bool has_pending_exception;
10933 Handle<Object> receiver = isolate->global(); 10677 Handle<Object> receiver = isolate->global();
10934 Handle<Object> result = 10678 Handle<Object> result =
10935 Execution::Call(compiled_function, receiver, 0, NULL, 10679 Execution::Call(compiled_function, receiver, 0, NULL,
10936 &has_pending_exception); 10680 &has_pending_exception);
10937 if (has_pending_exception) return Failure::Exception(); 10681 if (has_pending_exception) return Failure::Exception();
10938 return *result; 10682 return *result;
10939 } 10683 }
10940 10684
10941 10685
10942 static MaybeObject* Runtime_DebugGetLoadedScripts(RUNTIME_CALLING_CONVENTION) { 10686 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetLoadedScripts) {
10943 RUNTIME_GET_ISOLATE;
10944 HandleScope scope(isolate); 10687 HandleScope scope(isolate);
10945 ASSERT(args.length() == 0); 10688 ASSERT(args.length() == 0);
10946 10689
10947 // Fill the script objects. 10690 // Fill the script objects.
10948 Handle<FixedArray> instances = isolate->debug()->GetLoadedScripts(); 10691 Handle<FixedArray> instances = isolate->debug()->GetLoadedScripts();
10949 10692
10950 // Convert the script objects to proper JS objects. 10693 // Convert the script objects to proper JS objects.
10951 for (int i = 0; i < instances->length(); i++) { 10694 for (int i = 0; i < instances->length(); i++) {
10952 Handle<Script> script = Handle<Script>(Script::cast(instances->get(i))); 10695 Handle<Script> script = Handle<Script>(Script::cast(instances->get(i)));
10953 // Get the script wrapper in a local handle before calling GetScriptWrapper, 10696 // Get the script wrapper in a local handle before calling GetScriptWrapper,
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
11034 10777
11035 // Return the number of referencing objects found. 10778 // Return the number of referencing objects found.
11036 return count; 10779 return count;
11037 } 10780 }
11038 10781
11039 10782
11040 // Scan the heap for objects with direct references to an object 10783 // Scan the heap for objects with direct references to an object
11041 // args[0]: the object to find references to 10784 // args[0]: the object to find references to
11042 // args[1]: constructor function for instances to exclude (Mirror) 10785 // args[1]: constructor function for instances to exclude (Mirror)
11043 // args[2]: the the maximum number of objects to return 10786 // args[2]: the the maximum number of objects to return
11044 static MaybeObject* Runtime_DebugReferencedBy(RUNTIME_CALLING_CONVENTION) { 10787 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugReferencedBy) {
11045 RUNTIME_GET_ISOLATE;
11046 ASSERT(args.length() == 3); 10788 ASSERT(args.length() == 3);
11047 10789
11048 // First perform a full GC in order to avoid references from dead objects. 10790 // First perform a full GC in order to avoid references from dead objects.
11049 isolate->heap()->CollectAllGarbage(false); 10791 isolate->heap()->CollectAllGarbage(false);
11050 10792
11051 // Check parameters. 10793 // Check parameters.
11052 CONVERT_CHECKED(JSObject, target, args[0]); 10794 CONVERT_CHECKED(JSObject, target, args[0]);
11053 Object* instance_filter = args[1]; 10795 Object* instance_filter = args[1];
11054 RUNTIME_ASSERT(instance_filter->IsUndefined() || 10796 RUNTIME_ASSERT(instance_filter->IsUndefined() ||
11055 instance_filter->IsJSObject()); 10797 instance_filter->IsJSObject());
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
11115 } 10857 }
11116 10858
11117 // Return the number of referencing objects found. 10859 // Return the number of referencing objects found.
11118 return count; 10860 return count;
11119 } 10861 }
11120 10862
11121 10863
11122 // Scan the heap for objects constructed by a specific function. 10864 // Scan the heap for objects constructed by a specific function.
11123 // args[0]: the constructor to find instances of 10865 // args[0]: the constructor to find instances of
11124 // args[1]: the the maximum number of objects to return 10866 // args[1]: the the maximum number of objects to return
11125 static MaybeObject* Runtime_DebugConstructedBy(RUNTIME_CALLING_CONVENTION) { 10867 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugConstructedBy) {
11126 RUNTIME_GET_ISOLATE;
11127 ASSERT(args.length() == 2); 10868 ASSERT(args.length() == 2);
11128 10869
11129 // First perform a full GC in order to avoid dead objects. 10870 // First perform a full GC in order to avoid dead objects.
11130 isolate->heap()->CollectAllGarbage(false); 10871 isolate->heap()->CollectAllGarbage(false);
11131 10872
11132 // Check parameters. 10873 // Check parameters.
11133 CONVERT_CHECKED(JSFunction, constructor, args[0]); 10874 CONVERT_CHECKED(JSFunction, constructor, args[0]);
11134 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[1]); 10875 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[1]);
11135 RUNTIME_ASSERT(max_references >= 0); 10876 RUNTIME_ASSERT(max_references >= 0);
11136 10877
(...skipping 17 matching lines...) Expand all
11154 isolate->context()->global_context()->array_function()); 10895 isolate->context()->global_context()->array_function());
11155 if (!maybe_result->ToObject(&result)) return maybe_result; 10896 if (!maybe_result->ToObject(&result)) return maybe_result;
11156 } 10897 }
11157 JSArray::cast(result)->SetContent(instances); 10898 JSArray::cast(result)->SetContent(instances);
11158 return result; 10899 return result;
11159 } 10900 }
11160 10901
11161 10902
11162 // Find the effective prototype object as returned by __proto__. 10903 // Find the effective prototype object as returned by __proto__.
11163 // args[0]: the object to find the prototype for. 10904 // args[0]: the object to find the prototype for.
11164 static MaybeObject* Runtime_DebugGetPrototype(RUNTIME_CALLING_CONVENTION) { 10905 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetPrototype) {
11165 RUNTIME_GET_ISOLATE;
11166 ASSERT(args.length() == 1); 10906 ASSERT(args.length() == 1);
11167 10907
11168 CONVERT_CHECKED(JSObject, obj, args[0]); 10908 CONVERT_CHECKED(JSObject, obj, args[0]);
11169 10909
11170 // Use the __proto__ accessor. 10910 // Use the __proto__ accessor.
11171 return Accessors::ObjectPrototype.getter(obj, NULL); 10911 return Accessors::ObjectPrototype.getter(obj, NULL);
11172 } 10912 }
11173 10913
11174 10914
11175 static MaybeObject* Runtime_SystemBreak(RUNTIME_CALLING_CONVENTION) { 10915 RUNTIME_FUNCTION(MaybeObject*, Runtime_SystemBreak) {
11176 RUNTIME_GET_ISOLATE;
11177 ASSERT(args.length() == 0); 10916 ASSERT(args.length() == 0);
11178 CPU::DebugBreak(); 10917 CPU::DebugBreak();
11179 return isolate->heap()->undefined_value(); 10918 return isolate->heap()->undefined_value();
11180 } 10919 }
11181 10920
11182 10921
11183 static MaybeObject* Runtime_DebugDisassembleFunction( 10922 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugDisassembleFunction) {
11184 RUNTIME_CALLING_CONVENTION) {
11185 RUNTIME_GET_ISOLATE;
11186 #ifdef DEBUG 10923 #ifdef DEBUG
11187 HandleScope scope(isolate); 10924 HandleScope scope(isolate);
11188 ASSERT(args.length() == 1); 10925 ASSERT(args.length() == 1);
11189 // Get the function and make sure it is compiled. 10926 // Get the function and make sure it is compiled.
11190 CONVERT_ARG_CHECKED(JSFunction, func, 0); 10927 CONVERT_ARG_CHECKED(JSFunction, func, 0);
11191 Handle<SharedFunctionInfo> shared(func->shared()); 10928 Handle<SharedFunctionInfo> shared(func->shared());
11192 if (!EnsureCompiled(shared, KEEP_EXCEPTION)) { 10929 if (!EnsureCompiled(shared, KEEP_EXCEPTION)) {
11193 return Failure::Exception(); 10930 return Failure::Exception();
11194 } 10931 }
11195 func->code()->PrintLn(); 10932 func->code()->PrintLn();
11196 #endif // DEBUG 10933 #endif // DEBUG
11197 return isolate->heap()->undefined_value(); 10934 return isolate->heap()->undefined_value();
11198 } 10935 }
11199 10936
11200 10937
11201 static MaybeObject* Runtime_DebugDisassembleConstructor( 10938 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugDisassembleConstructor) {
11202 RUNTIME_CALLING_CONVENTION) {
11203 RUNTIME_GET_ISOLATE;
11204 #ifdef DEBUG 10939 #ifdef DEBUG
11205 HandleScope scope(isolate); 10940 HandleScope scope(isolate);
11206 ASSERT(args.length() == 1); 10941 ASSERT(args.length() == 1);
11207 // Get the function and make sure it is compiled. 10942 // Get the function and make sure it is compiled.
11208 CONVERT_ARG_CHECKED(JSFunction, func, 0); 10943 CONVERT_ARG_CHECKED(JSFunction, func, 0);
11209 Handle<SharedFunctionInfo> shared(func->shared()); 10944 Handle<SharedFunctionInfo> shared(func->shared());
11210 if (!EnsureCompiled(shared, KEEP_EXCEPTION)) { 10945 if (!EnsureCompiled(shared, KEEP_EXCEPTION)) {
11211 return Failure::Exception(); 10946 return Failure::Exception();
11212 } 10947 }
11213 shared->construct_stub()->PrintLn(); 10948 shared->construct_stub()->PrintLn();
11214 #endif // DEBUG 10949 #endif // DEBUG
11215 return isolate->heap()->undefined_value(); 10950 return isolate->heap()->undefined_value();
11216 } 10951 }
11217 10952
11218 10953
11219 static MaybeObject* Runtime_FunctionGetInferredName( 10954 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetInferredName) {
11220 RUNTIME_CALLING_CONVENTION) {
11221 RUNTIME_GET_ISOLATE;
11222 NoHandleAllocation ha; 10955 NoHandleAllocation ha;
11223 ASSERT(args.length() == 1); 10956 ASSERT(args.length() == 1);
11224 10957
11225 CONVERT_CHECKED(JSFunction, f, args[0]); 10958 CONVERT_CHECKED(JSFunction, f, args[0]);
11226 return f->shared()->inferred_name(); 10959 return f->shared()->inferred_name();
11227 } 10960 }
11228 10961
11229 10962
11230 static int FindSharedFunctionInfosForScript(Script* script, 10963 static int FindSharedFunctionInfosForScript(Script* script,
11231 FixedArray* buffer) { 10964 FixedArray* buffer) {
(...skipping 15 matching lines...) Expand all
11247 buffer->set(counter, shared); 10980 buffer->set(counter, shared);
11248 } 10981 }
11249 counter++; 10982 counter++;
11250 } 10983 }
11251 return counter; 10984 return counter;
11252 } 10985 }
11253 10986
11254 // For a script finds all SharedFunctionInfo's in the heap that points 10987 // For a script finds all SharedFunctionInfo's in the heap that points
11255 // to this script. Returns JSArray of SharedFunctionInfo wrapped 10988 // to this script. Returns JSArray of SharedFunctionInfo wrapped
11256 // in OpaqueReferences. 10989 // in OpaqueReferences.
11257 static MaybeObject* Runtime_LiveEditFindSharedFunctionInfosForScript( 10990 RUNTIME_FUNCTION(MaybeObject*,
11258 RUNTIME_CALLING_CONVENTION) { 10991 Runtime_LiveEditFindSharedFunctionInfosForScript) {
11259 RUNTIME_GET_ISOLATE;
11260 ASSERT(args.length() == 1); 10992 ASSERT(args.length() == 1);
11261 HandleScope scope(isolate); 10993 HandleScope scope(isolate);
11262 CONVERT_CHECKED(JSValue, script_value, args[0]); 10994 CONVERT_CHECKED(JSValue, script_value, args[0]);
11263 10995
11264 Handle<Script> script = Handle<Script>(Script::cast(script_value->value())); 10996 Handle<Script> script = Handle<Script>(Script::cast(script_value->value()));
11265 10997
11266 const int kBufferSize = 32; 10998 const int kBufferSize = 32;
11267 10999
11268 Handle<FixedArray> array; 11000 Handle<FixedArray> array;
11269 array = isolate->factory()->NewFixedArray(kBufferSize); 11001 array = isolate->factory()->NewFixedArray(kBufferSize);
(...skipping 11 matching lines...) Expand all
11281 return *result; 11013 return *result;
11282 } 11014 }
11283 11015
11284 // For a script calculates compilation information about all its functions. 11016 // For a script calculates compilation information about all its functions.
11285 // The script source is explicitly specified by the second argument. 11017 // The script source is explicitly specified by the second argument.
11286 // The source of the actual script is not used, however it is important that 11018 // The source of the actual script is not used, however it is important that
11287 // all generated code keeps references to this particular instance of script. 11019 // all generated code keeps references to this particular instance of script.
11288 // Returns a JSArray of compilation infos. The array is ordered so that 11020 // Returns a JSArray of compilation infos. The array is ordered so that
11289 // each function with all its descendant is always stored in a continues range 11021 // each function with all its descendant is always stored in a continues range
11290 // with the function itself going first. The root function is a script function. 11022 // with the function itself going first. The root function is a script function.
11291 static MaybeObject* Runtime_LiveEditGatherCompileInfo( 11023 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditGatherCompileInfo) {
11292 RUNTIME_CALLING_CONVENTION) {
11293 RUNTIME_GET_ISOLATE;
11294 ASSERT(args.length() == 2); 11024 ASSERT(args.length() == 2);
11295 HandleScope scope(isolate); 11025 HandleScope scope(isolate);
11296 CONVERT_CHECKED(JSValue, script, args[0]); 11026 CONVERT_CHECKED(JSValue, script, args[0]);
11297 CONVERT_ARG_CHECKED(String, source, 1); 11027 CONVERT_ARG_CHECKED(String, source, 1);
11298 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); 11028 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value()));
11299 11029
11300 JSArray* result = LiveEdit::GatherCompileInfo(script_handle, source); 11030 JSArray* result = LiveEdit::GatherCompileInfo(script_handle, source);
11301 11031
11302 if (isolate->has_pending_exception()) { 11032 if (isolate->has_pending_exception()) {
11303 return Failure::Exception(); 11033 return Failure::Exception();
11304 } 11034 }
11305 11035
11306 return result; 11036 return result;
11307 } 11037 }
11308 11038
11309 // Changes the source of the script to a new_source. 11039 // Changes the source of the script to a new_source.
11310 // If old_script_name is provided (i.e. is a String), also creates a copy of 11040 // If old_script_name is provided (i.e. is a String), also creates a copy of
11311 // the script with its original source and sends notification to debugger. 11041 // the script with its original source and sends notification to debugger.
11312 static MaybeObject* Runtime_LiveEditReplaceScript(RUNTIME_CALLING_CONVENTION) { 11042 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditReplaceScript) {
11313 RUNTIME_GET_ISOLATE;
11314 ASSERT(args.length() == 3); 11043 ASSERT(args.length() == 3);
11315 HandleScope scope(isolate); 11044 HandleScope scope(isolate);
11316 CONVERT_CHECKED(JSValue, original_script_value, args[0]); 11045 CONVERT_CHECKED(JSValue, original_script_value, args[0]);
11317 CONVERT_ARG_CHECKED(String, new_source, 1); 11046 CONVERT_ARG_CHECKED(String, new_source, 1);
11318 Handle<Object> old_script_name(args[2], isolate); 11047 Handle<Object> old_script_name(args[2], isolate);
11319 11048
11320 CONVERT_CHECKED(Script, original_script_pointer, 11049 CONVERT_CHECKED(Script, original_script_pointer,
11321 original_script_value->value()); 11050 original_script_value->value());
11322 Handle<Script> original_script(original_script_pointer); 11051 Handle<Script> original_script(original_script_pointer);
11323 11052
11324 Object* old_script = LiveEdit::ChangeScriptSource(original_script, 11053 Object* old_script = LiveEdit::ChangeScriptSource(original_script,
11325 new_source, 11054 new_source,
11326 old_script_name); 11055 old_script_name);
11327 11056
11328 if (old_script->IsScript()) { 11057 if (old_script->IsScript()) {
11329 Handle<Script> script_handle(Script::cast(old_script)); 11058 Handle<Script> script_handle(Script::cast(old_script));
11330 return *(GetScriptWrapper(script_handle)); 11059 return *(GetScriptWrapper(script_handle));
11331 } else { 11060 } else {
11332 return isolate->heap()->null_value(); 11061 return isolate->heap()->null_value();
11333 } 11062 }
11334 } 11063 }
11335 11064
11336 11065
11337 static MaybeObject* Runtime_LiveEditFunctionSourceUpdated( 11066 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditFunctionSourceUpdated) {
11338 RUNTIME_CALLING_CONVENTION) {
11339 RUNTIME_GET_ISOLATE;
11340 ASSERT(args.length() == 1); 11067 ASSERT(args.length() == 1);
11341 HandleScope scope(isolate); 11068 HandleScope scope(isolate);
11342 CONVERT_ARG_CHECKED(JSArray, shared_info, 0); 11069 CONVERT_ARG_CHECKED(JSArray, shared_info, 0);
11343 return LiveEdit::FunctionSourceUpdated(shared_info); 11070 return LiveEdit::FunctionSourceUpdated(shared_info);
11344 } 11071 }
11345 11072
11346 11073
11347 // Replaces code of SharedFunctionInfo with a new one. 11074 // Replaces code of SharedFunctionInfo with a new one.
11348 static MaybeObject* Runtime_LiveEditReplaceFunctionCode( 11075 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditReplaceFunctionCode) {
11349 RUNTIME_CALLING_CONVENTION) {
11350 RUNTIME_GET_ISOLATE;
11351 ASSERT(args.length() == 2); 11076 ASSERT(args.length() == 2);
11352 HandleScope scope(isolate); 11077 HandleScope scope(isolate);
11353 CONVERT_ARG_CHECKED(JSArray, new_compile_info, 0); 11078 CONVERT_ARG_CHECKED(JSArray, new_compile_info, 0);
11354 CONVERT_ARG_CHECKED(JSArray, shared_info, 1); 11079 CONVERT_ARG_CHECKED(JSArray, shared_info, 1);
11355 11080
11356 return LiveEdit::ReplaceFunctionCode(new_compile_info, shared_info); 11081 return LiveEdit::ReplaceFunctionCode(new_compile_info, shared_info);
11357 } 11082 }
11358 11083
11359 // Connects SharedFunctionInfo to another script. 11084 // Connects SharedFunctionInfo to another script.
11360 static MaybeObject* Runtime_LiveEditFunctionSetScript( 11085 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditFunctionSetScript) {
11361 RUNTIME_CALLING_CONVENTION) {
11362 RUNTIME_GET_ISOLATE;
11363 ASSERT(args.length() == 2); 11086 ASSERT(args.length() == 2);
11364 HandleScope scope(isolate); 11087 HandleScope scope(isolate);
11365 Handle<Object> function_object(args[0], isolate); 11088 Handle<Object> function_object(args[0], isolate);
11366 Handle<Object> script_object(args[1], isolate); 11089 Handle<Object> script_object(args[1], isolate);
11367 11090
11368 if (function_object->IsJSValue()) { 11091 if (function_object->IsJSValue()) {
11369 Handle<JSValue> function_wrapper = Handle<JSValue>::cast(function_object); 11092 Handle<JSValue> function_wrapper = Handle<JSValue>::cast(function_object);
11370 if (script_object->IsJSValue()) { 11093 if (script_object->IsJSValue()) {
11371 CONVERT_CHECKED(Script, script, JSValue::cast(*script_object)->value()); 11094 CONVERT_CHECKED(Script, script, JSValue::cast(*script_object)->value());
11372 script_object = Handle<Object>(script, isolate); 11095 script_object = Handle<Object>(script, isolate);
11373 } 11096 }
11374 11097
11375 LiveEdit::SetFunctionScript(function_wrapper, script_object); 11098 LiveEdit::SetFunctionScript(function_wrapper, script_object);
11376 } else { 11099 } else {
11377 // Just ignore this. We may not have a SharedFunctionInfo for some functions 11100 // Just ignore this. We may not have a SharedFunctionInfo for some functions
11378 // and we check it in this function. 11101 // and we check it in this function.
11379 } 11102 }
11380 11103
11381 return isolate->heap()->undefined_value(); 11104 return isolate->heap()->undefined_value();
11382 } 11105 }
11383 11106
11384 11107
11385 // In a code of a parent function replaces original function as embedded object 11108 // In a code of a parent function replaces original function as embedded object
11386 // with a substitution one. 11109 // with a substitution one.
11387 static MaybeObject* Runtime_LiveEditReplaceRefToNestedFunction( 11110 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditReplaceRefToNestedFunction) {
11388 RUNTIME_CALLING_CONVENTION) {
11389 RUNTIME_GET_ISOLATE;
11390 ASSERT(args.length() == 3); 11111 ASSERT(args.length() == 3);
11391 HandleScope scope(isolate); 11112 HandleScope scope(isolate);
11392 11113
11393 CONVERT_ARG_CHECKED(JSValue, parent_wrapper, 0); 11114 CONVERT_ARG_CHECKED(JSValue, parent_wrapper, 0);
11394 CONVERT_ARG_CHECKED(JSValue, orig_wrapper, 1); 11115 CONVERT_ARG_CHECKED(JSValue, orig_wrapper, 1);
11395 CONVERT_ARG_CHECKED(JSValue, subst_wrapper, 2); 11116 CONVERT_ARG_CHECKED(JSValue, subst_wrapper, 2);
11396 11117
11397 LiveEdit::ReplaceRefToNestedFunction(parent_wrapper, orig_wrapper, 11118 LiveEdit::ReplaceRefToNestedFunction(parent_wrapper, orig_wrapper,
11398 subst_wrapper); 11119 subst_wrapper);
11399 11120
11400 return isolate->heap()->undefined_value(); 11121 return isolate->heap()->undefined_value();
11401 } 11122 }
11402 11123
11403 11124
11404 // Updates positions of a shared function info (first parameter) according 11125 // Updates positions of a shared function info (first parameter) according
11405 // to script source change. Text change is described in second parameter as 11126 // to script source change. Text change is described in second parameter as
11406 // array of groups of 3 numbers: 11127 // array of groups of 3 numbers:
11407 // (change_begin, change_end, change_end_new_position). 11128 // (change_begin, change_end, change_end_new_position).
11408 // Each group describes a change in text; groups are sorted by change_begin. 11129 // Each group describes a change in text; groups are sorted by change_begin.
11409 static MaybeObject* Runtime_LiveEditPatchFunctionPositions( 11130 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditPatchFunctionPositions) {
11410 RUNTIME_CALLING_CONVENTION) {
11411 RUNTIME_GET_ISOLATE;
11412 ASSERT(args.length() == 2); 11131 ASSERT(args.length() == 2);
11413 HandleScope scope(isolate); 11132 HandleScope scope(isolate);
11414 CONVERT_ARG_CHECKED(JSArray, shared_array, 0); 11133 CONVERT_ARG_CHECKED(JSArray, shared_array, 0);
11415 CONVERT_ARG_CHECKED(JSArray, position_change_array, 1); 11134 CONVERT_ARG_CHECKED(JSArray, position_change_array, 1);
11416 11135
11417 return LiveEdit::PatchFunctionPositions(shared_array, position_change_array); 11136 return LiveEdit::PatchFunctionPositions(shared_array, position_change_array);
11418 } 11137 }
11419 11138
11420 11139
11421 // For array of SharedFunctionInfo's (each wrapped in JSValue) 11140 // For array of SharedFunctionInfo's (each wrapped in JSValue)
11422 // checks that none of them have activations on stacks (of any thread). 11141 // checks that none of them have activations on stacks (of any thread).
11423 // Returns array of the same length with corresponding results of 11142 // Returns array of the same length with corresponding results of
11424 // LiveEdit::FunctionPatchabilityStatus type. 11143 // LiveEdit::FunctionPatchabilityStatus type.
11425 static MaybeObject* Runtime_LiveEditCheckAndDropActivations( 11144 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditCheckAndDropActivations) {
11426 RUNTIME_CALLING_CONVENTION) {
11427 RUNTIME_GET_ISOLATE;
11428 ASSERT(args.length() == 2); 11145 ASSERT(args.length() == 2);
11429 HandleScope scope(isolate); 11146 HandleScope scope(isolate);
11430 CONVERT_ARG_CHECKED(JSArray, shared_array, 0); 11147 CONVERT_ARG_CHECKED(JSArray, shared_array, 0);
11431 CONVERT_BOOLEAN_CHECKED(do_drop, args[1]); 11148 CONVERT_BOOLEAN_CHECKED(do_drop, args[1]);
11432 11149
11433 return *LiveEdit::CheckAndDropActivations(shared_array, do_drop); 11150 return *LiveEdit::CheckAndDropActivations(shared_array, do_drop);
11434 } 11151 }
11435 11152
11436 // Compares 2 strings line-by-line, then token-wise and returns diff in form 11153 // Compares 2 strings line-by-line, then token-wise and returns diff in form
11437 // of JSArray of triplets (pos1, pos1_end, pos2_end) describing list 11154 // of JSArray of triplets (pos1, pos1_end, pos2_end) describing list
11438 // of diff chunks. 11155 // of diff chunks.
11439 static MaybeObject* Runtime_LiveEditCompareStrings(RUNTIME_CALLING_CONVENTION) { 11156 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditCompareStrings) {
11440 RUNTIME_GET_ISOLATE;
11441 ASSERT(args.length() == 2); 11157 ASSERT(args.length() == 2);
11442 HandleScope scope(isolate); 11158 HandleScope scope(isolate);
11443 CONVERT_ARG_CHECKED(String, s1, 0); 11159 CONVERT_ARG_CHECKED(String, s1, 0);
11444 CONVERT_ARG_CHECKED(String, s2, 1); 11160 CONVERT_ARG_CHECKED(String, s2, 1);
11445 11161
11446 return *LiveEdit::CompareStrings(s1, s2); 11162 return *LiveEdit::CompareStrings(s1, s2);
11447 } 11163 }
11448 11164
11449 11165
11450 // A testing entry. Returns statement position which is the closest to 11166 // A testing entry. Returns statement position which is the closest to
11451 // source_position. 11167 // source_position.
11452 static MaybeObject* Runtime_GetFunctionCodePositionFromSource( 11168 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFunctionCodePositionFromSource) {
11453 RUNTIME_CALLING_CONVENTION) {
11454 RUNTIME_GET_ISOLATE;
11455 ASSERT(args.length() == 2); 11169 ASSERT(args.length() == 2);
11456 HandleScope scope(isolate); 11170 HandleScope scope(isolate);
11457 CONVERT_ARG_CHECKED(JSFunction, function, 0); 11171 CONVERT_ARG_CHECKED(JSFunction, function, 0);
11458 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); 11172 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]);
11459 11173
11460 Handle<Code> code(function->code(), isolate); 11174 Handle<Code> code(function->code(), isolate);
11461 11175
11462 if (code->kind() != Code::FUNCTION && 11176 if (code->kind() != Code::FUNCTION &&
11463 code->kind() != Code::OPTIMIZED_FUNCTION) { 11177 code->kind() != Code::OPTIMIZED_FUNCTION) {
11464 return isolate->heap()->undefined_value(); 11178 return isolate->heap()->undefined_value();
(...skipping 16 matching lines...) Expand all
11481 it.next(); 11195 it.next();
11482 } 11196 }
11483 11197
11484 return Smi::FromInt(closest_pc); 11198 return Smi::FromInt(closest_pc);
11485 } 11199 }
11486 11200
11487 11201
11488 // Calls specified function with or without entering the debugger. 11202 // Calls specified function with or without entering the debugger.
11489 // This is used in unit tests to run code as if debugger is entered or simply 11203 // This is used in unit tests to run code as if debugger is entered or simply
11490 // to have a stack with C++ frame in the middle. 11204 // to have a stack with C++ frame in the middle.
11491 static MaybeObject* Runtime_ExecuteInDebugContext(RUNTIME_CALLING_CONVENTION) { 11205 RUNTIME_FUNCTION(MaybeObject*, Runtime_ExecuteInDebugContext) {
11492 RUNTIME_GET_ISOLATE;
11493 ASSERT(args.length() == 2); 11206 ASSERT(args.length() == 2);
11494 HandleScope scope(isolate); 11207 HandleScope scope(isolate);
11495 CONVERT_ARG_CHECKED(JSFunction, function, 0); 11208 CONVERT_ARG_CHECKED(JSFunction, function, 0);
11496 CONVERT_BOOLEAN_CHECKED(without_debugger, args[1]); 11209 CONVERT_BOOLEAN_CHECKED(without_debugger, args[1]);
11497 11210
11498 Handle<Object> result; 11211 Handle<Object> result;
11499 bool pending_exception; 11212 bool pending_exception;
11500 { 11213 {
11501 if (without_debugger) { 11214 if (without_debugger) {
11502 result = Execution::Call(function, isolate->global(), 0, NULL, 11215 result = Execution::Call(function, isolate->global(), 0, NULL,
11503 &pending_exception); 11216 &pending_exception);
11504 } else { 11217 } else {
11505 EnterDebugger enter_debugger; 11218 EnterDebugger enter_debugger;
11506 result = Execution::Call(function, isolate->global(), 0, NULL, 11219 result = Execution::Call(function, isolate->global(), 0, NULL,
11507 &pending_exception); 11220 &pending_exception);
11508 } 11221 }
11509 } 11222 }
11510 if (!pending_exception) { 11223 if (!pending_exception) {
11511 return *result; 11224 return *result;
11512 } else { 11225 } else {
11513 return Failure::Exception(); 11226 return Failure::Exception();
11514 } 11227 }
11515 } 11228 }
11516 11229
11517 11230
11518 // Sets a v8 flag. 11231 // Sets a v8 flag.
11519 static MaybeObject* Runtime_SetFlags(RUNTIME_CALLING_CONVENTION) { 11232 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetFlags) {
11520 RUNTIME_GET_ISOLATE;
11521 CONVERT_CHECKED(String, arg, args[0]); 11233 CONVERT_CHECKED(String, arg, args[0]);
11522 SmartPointer<char> flags = 11234 SmartPointer<char> flags =
11523 arg->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); 11235 arg->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
11524 FlagList::SetFlagsFromString(*flags, StrLength(*flags)); 11236 FlagList::SetFlagsFromString(*flags, StrLength(*flags));
11525 return isolate->heap()->undefined_value(); 11237 return isolate->heap()->undefined_value();
11526 } 11238 }
11527 11239
11528 11240
11529 // Performs a GC. 11241 // Performs a GC.
11530 // Presently, it only does a full GC. 11242 // Presently, it only does a full GC.
11531 static MaybeObject* Runtime_CollectGarbage(RUNTIME_CALLING_CONVENTION) { 11243 RUNTIME_FUNCTION(MaybeObject*, Runtime_CollectGarbage) {
11532 RUNTIME_GET_ISOLATE;
11533 isolate->heap()->CollectAllGarbage(true); 11244 isolate->heap()->CollectAllGarbage(true);
11534 return isolate->heap()->undefined_value(); 11245 return isolate->heap()->undefined_value();
11535 } 11246 }
11536 11247
11537 11248
11538 // Gets the current heap usage. 11249 // Gets the current heap usage.
11539 static MaybeObject* Runtime_GetHeapUsage(RUNTIME_CALLING_CONVENTION) { 11250 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetHeapUsage) {
11540 RUNTIME_GET_ISOLATE;
11541 int usage = static_cast<int>(isolate->heap()->SizeOfObjects()); 11251 int usage = static_cast<int>(isolate->heap()->SizeOfObjects());
11542 if (!Smi::IsValid(usage)) { 11252 if (!Smi::IsValid(usage)) {
11543 return *isolate->factory()->NewNumberFromInt(usage); 11253 return *isolate->factory()->NewNumberFromInt(usage);
11544 } 11254 }
11545 return Smi::FromInt(usage); 11255 return Smi::FromInt(usage);
11546 } 11256 }
11547 11257
11548 11258
11549 // Captures a live object list from the present heap. 11259 // Captures a live object list from the present heap.
11550 static MaybeObject* Runtime_HasLOLEnabled(RUNTIME_CALLING_CONVENTION) { 11260 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasLOLEnabled) {
11551 RUNTIME_GET_ISOLATE;
11552 #ifdef LIVE_OBJECT_LIST 11261 #ifdef LIVE_OBJECT_LIST
11553 return isolate->heap()->true_value(); 11262 return isolate->heap()->true_value();
11554 #else 11263 #else
11555 return isolate->heap()->false_value(); 11264 return isolate->heap()->false_value();
11556 #endif 11265 #endif
11557 } 11266 }
11558 11267
11559 11268
11560 // Captures a live object list from the present heap. 11269 // Captures a live object list from the present heap.
11561 static MaybeObject* Runtime_CaptureLOL(RUNTIME_CALLING_CONVENTION) { 11270 RUNTIME_FUNCTION(MaybeObject*, Runtime_CaptureLOL) {
11562 RUNTIME_GET_ISOLATE;
11563 #ifdef LIVE_OBJECT_LIST 11271 #ifdef LIVE_OBJECT_LIST
11564 return LiveObjectList::Capture(); 11272 return LiveObjectList::Capture();
11565 #else 11273 #else
11566 return isolate->heap()->undefined_value(); 11274 return isolate->heap()->undefined_value();
11567 #endif 11275 #endif
11568 } 11276 }
11569 11277
11570 11278
11571 // Deletes the specified live object list. 11279 // Deletes the specified live object list.
11572 static MaybeObject* Runtime_DeleteLOL(RUNTIME_CALLING_CONVENTION) { 11280 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteLOL) {
11573 RUNTIME_GET_ISOLATE;
11574 #ifdef LIVE_OBJECT_LIST 11281 #ifdef LIVE_OBJECT_LIST
11575 CONVERT_SMI_CHECKED(id, args[0]); 11282 CONVERT_SMI_CHECKED(id, args[0]);
11576 bool success = LiveObjectList::Delete(id); 11283 bool success = LiveObjectList::Delete(id);
11577 return success ? isolate->heap()->true_value() : 11284 return success ? isolate->heap()->true_value() :
11578 isolate->heap()->false_value(); 11285 isolate->heap()->false_value();
11579 #else 11286 #else
11580 return isolate->heap()->undefined_value(); 11287 return isolate->heap()->undefined_value();
11581 #endif 11288 #endif
11582 } 11289 }
11583 11290
11584 11291
11585 // Generates the response to a debugger request for a dump of the objects 11292 // Generates the response to a debugger request for a dump of the objects
11586 // contained in the difference between the captured live object lists 11293 // contained in the difference between the captured live object lists
11587 // specified by id1 and id2. 11294 // specified by id1 and id2.
11588 // If id1 is 0 (i.e. not a valid lol), then the whole of lol id2 will be 11295 // If id1 is 0 (i.e. not a valid lol), then the whole of lol id2 will be
11589 // dumped. 11296 // dumped.
11590 static MaybeObject* Runtime_DumpLOL(RUNTIME_CALLING_CONVENTION) { 11297 RUNTIME_FUNCTION(MaybeObject*, Runtime_DumpLOL) {
11591 RUNTIME_GET_ISOLATE;
11592 #ifdef LIVE_OBJECT_LIST 11298 #ifdef LIVE_OBJECT_LIST
11593 HandleScope scope; 11299 HandleScope scope;
11594 CONVERT_SMI_CHECKED(id1, args[0]); 11300 CONVERT_SMI_CHECKED(id1, args[0]);
11595 CONVERT_SMI_CHECKED(id2, args[1]); 11301 CONVERT_SMI_CHECKED(id2, args[1]);
11596 CONVERT_SMI_CHECKED(start, args[2]); 11302 CONVERT_SMI_CHECKED(start, args[2]);
11597 CONVERT_SMI_CHECKED(count, args[3]); 11303 CONVERT_SMI_CHECKED(count, args[3]);
11598 CONVERT_ARG_CHECKED(JSObject, filter_obj, 4); 11304 CONVERT_ARG_CHECKED(JSObject, filter_obj, 4);
11599 EnterDebugger enter_debugger; 11305 EnterDebugger enter_debugger;
11600 return LiveObjectList::Dump(id1, id2, start, count, filter_obj); 11306 return LiveObjectList::Dump(id1, id2, start, count, filter_obj);
11601 #else 11307 #else
11602 return isolate->heap()->undefined_value(); 11308 return isolate->heap()->undefined_value();
11603 #endif 11309 #endif
11604 } 11310 }
11605 11311
11606 11312
11607 // Gets the specified object as requested by the debugger. 11313 // Gets the specified object as requested by the debugger.
11608 // This is only used for obj ids shown in live object lists. 11314 // This is only used for obj ids shown in live object lists.
11609 static MaybeObject* Runtime_GetLOLObj(RUNTIME_CALLING_CONVENTION) { 11315 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLOLObj) {
11610 RUNTIME_GET_ISOLATE;
11611 #ifdef LIVE_OBJECT_LIST 11316 #ifdef LIVE_OBJECT_LIST
11612 CONVERT_SMI_CHECKED(obj_id, args[0]); 11317 CONVERT_SMI_CHECKED(obj_id, args[0]);
11613 Object* result = LiveObjectList::GetObj(obj_id); 11318 Object* result = LiveObjectList::GetObj(obj_id);
11614 return result; 11319 return result;
11615 #else 11320 #else
11616 return isolate->heap()->undefined_value(); 11321 return isolate->heap()->undefined_value();
11617 #endif 11322 #endif
11618 } 11323 }
11619 11324
11620 11325
11621 // Gets the obj id for the specified address if valid. 11326 // Gets the obj id for the specified address if valid.
11622 // This is only used for obj ids shown in live object lists. 11327 // This is only used for obj ids shown in live object lists.
11623 static MaybeObject* Runtime_GetLOLObjId(RUNTIME_CALLING_CONVENTION) { 11328 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLOLObjId) {
11624 RUNTIME_GET_ISOLATE;
11625 #ifdef LIVE_OBJECT_LIST 11329 #ifdef LIVE_OBJECT_LIST
11626 HandleScope scope; 11330 HandleScope scope;
11627 CONVERT_ARG_CHECKED(String, address, 0); 11331 CONVERT_ARG_CHECKED(String, address, 0);
11628 Object* result = LiveObjectList::GetObjId(address); 11332 Object* result = LiveObjectList::GetObjId(address);
11629 return result; 11333 return result;
11630 #else 11334 #else
11631 return isolate->heap()->undefined_value(); 11335 return isolate->heap()->undefined_value();
11632 #endif 11336 #endif
11633 } 11337 }
11634 11338
11635 11339
11636 // Gets the retainers that references the specified object alive. 11340 // Gets the retainers that references the specified object alive.
11637 static MaybeObject* Runtime_GetLOLObjRetainers(RUNTIME_CALLING_CONVENTION) { 11341 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLOLObjRetainers) {
11638 RUNTIME_GET_ISOLATE;
11639 #ifdef LIVE_OBJECT_LIST 11342 #ifdef LIVE_OBJECT_LIST
11640 HandleScope scope; 11343 HandleScope scope;
11641 CONVERT_SMI_CHECKED(obj_id, args[0]); 11344 CONVERT_SMI_CHECKED(obj_id, args[0]);
11642 RUNTIME_ASSERT(args[1]->IsUndefined() || args[1]->IsJSObject()); 11345 RUNTIME_ASSERT(args[1]->IsUndefined() || args[1]->IsJSObject());
11643 RUNTIME_ASSERT(args[2]->IsUndefined() || args[2]->IsBoolean()); 11346 RUNTIME_ASSERT(args[2]->IsUndefined() || args[2]->IsBoolean());
11644 RUNTIME_ASSERT(args[3]->IsUndefined() || args[3]->IsSmi()); 11347 RUNTIME_ASSERT(args[3]->IsUndefined() || args[3]->IsSmi());
11645 RUNTIME_ASSERT(args[4]->IsUndefined() || args[4]->IsSmi()); 11348 RUNTIME_ASSERT(args[4]->IsUndefined() || args[4]->IsSmi());
11646 CONVERT_ARG_CHECKED(JSObject, filter_obj, 5); 11349 CONVERT_ARG_CHECKED(JSObject, filter_obj, 5);
11647 11350
11648 Handle<JSObject> instance_filter; 11351 Handle<JSObject> instance_filter;
(...skipping 19 matching lines...) Expand all
11668 start, 11371 start,
11669 limit, 11372 limit,
11670 filter_obj); 11373 filter_obj);
11671 #else 11374 #else
11672 return isolate->heap()->undefined_value(); 11375 return isolate->heap()->undefined_value();
11673 #endif 11376 #endif
11674 } 11377 }
11675 11378
11676 11379
11677 // Gets the reference path between 2 objects. 11380 // Gets the reference path between 2 objects.
11678 static MaybeObject* Runtime_GetLOLPath(RUNTIME_CALLING_CONVENTION) { 11381 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLOLPath) {
11679 RUNTIME_GET_ISOLATE;
11680 #ifdef LIVE_OBJECT_LIST 11382 #ifdef LIVE_OBJECT_LIST
11681 HandleScope scope; 11383 HandleScope scope;
11682 CONVERT_SMI_CHECKED(obj_id1, args[0]); 11384 CONVERT_SMI_CHECKED(obj_id1, args[0]);
11683 CONVERT_SMI_CHECKED(obj_id2, args[1]); 11385 CONVERT_SMI_CHECKED(obj_id2, args[1]);
11684 RUNTIME_ASSERT(args[2]->IsUndefined() || args[2]->IsJSObject()); 11386 RUNTIME_ASSERT(args[2]->IsUndefined() || args[2]->IsJSObject());
11685 11387
11686 Handle<JSObject> instance_filter; 11388 Handle<JSObject> instance_filter;
11687 if (args[2]->IsJSObject()) { 11389 if (args[2]->IsJSObject()) {
11688 instance_filter = args.at<JSObject>(2); 11390 instance_filter = args.at<JSObject>(2);
11689 } 11391 }
11690 11392
11691 Object* result = 11393 Object* result =
11692 LiveObjectList::GetPath(obj_id1, obj_id2, instance_filter); 11394 LiveObjectList::GetPath(obj_id1, obj_id2, instance_filter);
11693 return result; 11395 return result;
11694 #else 11396 #else
11695 return isolate->heap()->undefined_value(); 11397 return isolate->heap()->undefined_value();
11696 #endif 11398 #endif
11697 } 11399 }
11698 11400
11699 11401
11700 // Generates the response to a debugger request for a list of all 11402 // Generates the response to a debugger request for a list of all
11701 // previously captured live object lists. 11403 // previously captured live object lists.
11702 static MaybeObject* Runtime_InfoLOL(RUNTIME_CALLING_CONVENTION) { 11404 RUNTIME_FUNCTION(MaybeObject*, Runtime_InfoLOL) {
11703 RUNTIME_GET_ISOLATE;
11704 #ifdef LIVE_OBJECT_LIST 11405 #ifdef LIVE_OBJECT_LIST
11705 CONVERT_SMI_CHECKED(start, args[0]); 11406 CONVERT_SMI_CHECKED(start, args[0]);
11706 CONVERT_SMI_CHECKED(count, args[1]); 11407 CONVERT_SMI_CHECKED(count, args[1]);
11707 return LiveObjectList::Info(start, count); 11408 return LiveObjectList::Info(start, count);
11708 #else 11409 #else
11709 return isolate->heap()->undefined_value(); 11410 return isolate->heap()->undefined_value();
11710 #endif 11411 #endif
11711 } 11412 }
11712 11413
11713 11414
11714 // Gets a dump of the specified object as requested by the debugger. 11415 // Gets a dump of the specified object as requested by the debugger.
11715 // This is only used for obj ids shown in live object lists. 11416 // This is only used for obj ids shown in live object lists.
11716 static MaybeObject* Runtime_PrintLOLObj(RUNTIME_CALLING_CONVENTION) { 11417 RUNTIME_FUNCTION(MaybeObject*, Runtime_PrintLOLObj) {
11717 RUNTIME_GET_ISOLATE;
11718 #ifdef LIVE_OBJECT_LIST 11418 #ifdef LIVE_OBJECT_LIST
11719 HandleScope scope; 11419 HandleScope scope;
11720 CONVERT_SMI_CHECKED(obj_id, args[0]); 11420 CONVERT_SMI_CHECKED(obj_id, args[0]);
11721 Object* result = LiveObjectList::PrintObj(obj_id); 11421 Object* result = LiveObjectList::PrintObj(obj_id);
11722 return result; 11422 return result;
11723 #else 11423 #else
11724 return isolate->heap()->undefined_value(); 11424 return isolate->heap()->undefined_value();
11725 #endif 11425 #endif
11726 } 11426 }
11727 11427
11728 11428
11729 // Resets and releases all previously captured live object lists. 11429 // Resets and releases all previously captured live object lists.
11730 static MaybeObject* Runtime_ResetLOL(RUNTIME_CALLING_CONVENTION) { 11430 RUNTIME_FUNCTION(MaybeObject*, Runtime_ResetLOL) {
11731 RUNTIME_GET_ISOLATE;
11732 #ifdef LIVE_OBJECT_LIST 11431 #ifdef LIVE_OBJECT_LIST
11733 LiveObjectList::Reset(); 11432 LiveObjectList::Reset();
11734 return isolate->heap()->undefined_value(); 11433 return isolate->heap()->undefined_value();
11735 #else 11434 #else
11736 return isolate->heap()->undefined_value(); 11435 return isolate->heap()->undefined_value();
11737 #endif 11436 #endif
11738 } 11437 }
11739 11438
11740 11439
11741 // Generates the response to a debugger request for a summary of the types 11440 // Generates the response to a debugger request for a summary of the types
11742 // of objects in the difference between the captured live object lists 11441 // of objects in the difference between the captured live object lists
11743 // specified by id1 and id2. 11442 // specified by id1 and id2.
11744 // If id1 is 0 (i.e. not a valid lol), then the whole of lol id2 will be 11443 // If id1 is 0 (i.e. not a valid lol), then the whole of lol id2 will be
11745 // summarized. 11444 // summarized.
11746 static MaybeObject* Runtime_SummarizeLOL(RUNTIME_CALLING_CONVENTION) { 11445 RUNTIME_FUNCTION(MaybeObject*, Runtime_SummarizeLOL) {
11747 RUNTIME_GET_ISOLATE;
11748 #ifdef LIVE_OBJECT_LIST 11446 #ifdef LIVE_OBJECT_LIST
11749 HandleScope scope; 11447 HandleScope scope;
11750 CONVERT_SMI_CHECKED(id1, args[0]); 11448 CONVERT_SMI_CHECKED(id1, args[0]);
11751 CONVERT_SMI_CHECKED(id2, args[1]); 11449 CONVERT_SMI_CHECKED(id2, args[1]);
11752 CONVERT_ARG_CHECKED(JSObject, filter_obj, 2); 11450 CONVERT_ARG_CHECKED(JSObject, filter_obj, 2);
11753 11451
11754 EnterDebugger enter_debugger; 11452 EnterDebugger enter_debugger;
11755 return LiveObjectList::Summarize(id1, id2, filter_obj); 11453 return LiveObjectList::Summarize(id1, id2, filter_obj);
11756 #else 11454 #else
11757 return isolate->heap()->undefined_value(); 11455 return isolate->heap()->undefined_value();
11758 #endif 11456 #endif
11759 } 11457 }
11760 11458
11761 #endif // ENABLE_DEBUGGER_SUPPORT 11459 #endif // ENABLE_DEBUGGER_SUPPORT
11762 11460
11763 11461
11764 #ifdef ENABLE_LOGGING_AND_PROFILING 11462 #ifdef ENABLE_LOGGING_AND_PROFILING
11765 static MaybeObject* Runtime_ProfilerResume(RUNTIME_CALLING_CONVENTION) { 11463 RUNTIME_FUNCTION(MaybeObject*, Runtime_ProfilerResume) {
11766 RUNTIME_GET_ISOLATE;
11767 NoHandleAllocation ha; 11464 NoHandleAllocation ha;
11768 ASSERT(args.length() == 2); 11465 ASSERT(args.length() == 2);
11769 11466
11770 CONVERT_CHECKED(Smi, smi_modules, args[0]); 11467 CONVERT_CHECKED(Smi, smi_modules, args[0]);
11771 CONVERT_CHECKED(Smi, smi_tag, args[1]); 11468 CONVERT_CHECKED(Smi, smi_tag, args[1]);
11772 v8::V8::ResumeProfilerEx(smi_modules->value(), smi_tag->value()); 11469 v8::V8::ResumeProfilerEx(smi_modules->value(), smi_tag->value());
11773 return isolate->heap()->undefined_value(); 11470 return isolate->heap()->undefined_value();
11774 } 11471 }
11775 11472
11776 11473
11777 static MaybeObject* Runtime_ProfilerPause(RUNTIME_CALLING_CONVENTION) { 11474 RUNTIME_FUNCTION(MaybeObject*, Runtime_ProfilerPause) {
11778 RUNTIME_GET_ISOLATE;
11779 NoHandleAllocation ha; 11475 NoHandleAllocation ha;
11780 ASSERT(args.length() == 2); 11476 ASSERT(args.length() == 2);
11781 11477
11782 CONVERT_CHECKED(Smi, smi_modules, args[0]); 11478 CONVERT_CHECKED(Smi, smi_modules, args[0]);
11783 CONVERT_CHECKED(Smi, smi_tag, args[1]); 11479 CONVERT_CHECKED(Smi, smi_tag, args[1]);
11784 v8::V8::PauseProfilerEx(smi_modules->value(), smi_tag->value()); 11480 v8::V8::PauseProfilerEx(smi_modules->value(), smi_tag->value());
11785 return isolate->heap()->undefined_value(); 11481 return isolate->heap()->undefined_value();
11786 } 11482 }
11787 11483
11788 #endif // ENABLE_LOGGING_AND_PROFILING 11484 #endif // ENABLE_LOGGING_AND_PROFILING
(...skipping 26 matching lines...) Expand all
11815 if (script.is_null()) return FACTORY->undefined_value(); 11511 if (script.is_null()) return FACTORY->undefined_value();
11816 11512
11817 // Return the script found. 11513 // Return the script found.
11818 return GetScriptWrapper(script); 11514 return GetScriptWrapper(script);
11819 } 11515 }
11820 11516
11821 11517
11822 // Get the script object from script data. NOTE: Regarding performance 11518 // Get the script object from script data. NOTE: Regarding performance
11823 // see the NOTE for GetScriptFromScriptData. 11519 // see the NOTE for GetScriptFromScriptData.
11824 // args[0]: script data for the script to find the source for 11520 // args[0]: script data for the script to find the source for
11825 static MaybeObject* Runtime_GetScript(RUNTIME_CALLING_CONVENTION) { 11521 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScript) {
11826 RUNTIME_GET_ISOLATE;
11827 HandleScope scope(isolate); 11522 HandleScope scope(isolate);
11828 11523
11829 ASSERT(args.length() == 1); 11524 ASSERT(args.length() == 1);
11830 11525
11831 CONVERT_CHECKED(String, script_name, args[0]); 11526 CONVERT_CHECKED(String, script_name, args[0]);
11832 11527
11833 // Find the requested script. 11528 // Find the requested script.
11834 Handle<Object> result = 11529 Handle<Object> result =
11835 Runtime_GetScriptFromScriptName(Handle<String>(script_name)); 11530 Runtime_GetScriptFromScriptName(Handle<String>(script_name));
11836 return *result; 11531 return *result;
(...skipping 24 matching lines...) Expand all
11861 // obvious builtin calls. Some builtin calls (such as Number.ADD 11556 // obvious builtin calls. Some builtin calls (such as Number.ADD
11862 // which is invoked using 'call') are very difficult to recognize 11557 // which is invoked using 'call') are very difficult to recognize
11863 // so we're leaving them in for now. 11558 // so we're leaving them in for now.
11864 return *seen_caller && !frame->receiver()->IsJSBuiltinsObject(); 11559 return *seen_caller && !frame->receiver()->IsJSBuiltinsObject();
11865 } 11560 }
11866 11561
11867 11562
11868 // Collect the raw data for a stack trace. Returns an array of 4 11563 // Collect the raw data for a stack trace. Returns an array of 4
11869 // element segments each containing a receiver, function, code and 11564 // element segments each containing a receiver, function, code and
11870 // native code offset. 11565 // native code offset.
11871 static MaybeObject* Runtime_CollectStackTrace(RUNTIME_CALLING_CONVENTION) { 11566 RUNTIME_FUNCTION(MaybeObject*, Runtime_CollectStackTrace) {
11872 RUNTIME_GET_ISOLATE;
11873 ASSERT_EQ(args.length(), 2); 11567 ASSERT_EQ(args.length(), 2);
11874 Handle<Object> caller = args.at<Object>(0); 11568 Handle<Object> caller = args.at<Object>(0);
11875 CONVERT_NUMBER_CHECKED(int32_t, limit, Int32, args[1]); 11569 CONVERT_NUMBER_CHECKED(int32_t, limit, Int32, args[1]);
11876 11570
11877 HandleScope scope(isolate); 11571 HandleScope scope(isolate);
11878 Factory* factory = isolate->factory(); 11572 Factory* factory = isolate->factory();
11879 11573
11880 limit = Max(limit, 0); // Ensure that limit is not negative. 11574 limit = Max(limit, 0); // Ensure that limit is not negative.
11881 int initial_size = Min(limit, 10); 11575 int initial_size = Min(limit, 10);
11882 Handle<FixedArray> elements = 11576 Handle<FixedArray> elements =
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
11919 } 11613 }
11920 iter.Advance(); 11614 iter.Advance();
11921 } 11615 }
11922 Handle<JSArray> result = factory->NewJSArrayWithElements(elements); 11616 Handle<JSArray> result = factory->NewJSArrayWithElements(elements);
11923 result->set_length(Smi::FromInt(cursor)); 11617 result->set_length(Smi::FromInt(cursor));
11924 return *result; 11618 return *result;
11925 } 11619 }
11926 11620
11927 11621
11928 // Returns V8 version as a string. 11622 // Returns V8 version as a string.
11929 static MaybeObject* Runtime_GetV8Version(RUNTIME_CALLING_CONVENTION) { 11623 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetV8Version) {
11930 RUNTIME_GET_ISOLATE;
11931 ASSERT_EQ(args.length(), 0); 11624 ASSERT_EQ(args.length(), 0);
11932 11625
11933 NoHandleAllocation ha; 11626 NoHandleAllocation ha;
11934 11627
11935 const char* version_string = v8::V8::GetVersion(); 11628 const char* version_string = v8::V8::GetVersion();
11936 11629
11937 return isolate->heap()->AllocateStringFromAscii(CStrVector(version_string), 11630 return isolate->heap()->AllocateStringFromAscii(CStrVector(version_string),
11938 NOT_TENURED); 11631 NOT_TENURED);
11939 } 11632 }
11940 11633
11941 11634
11942 static MaybeObject* Runtime_Abort(RUNTIME_CALLING_CONVENTION) { 11635 RUNTIME_FUNCTION(MaybeObject*, Runtime_Abort) {
11943 RUNTIME_GET_ISOLATE;
11944 ASSERT(args.length() == 2); 11636 ASSERT(args.length() == 2);
11945 OS::PrintError("abort: %s\n", reinterpret_cast<char*>(args[0]) + 11637 OS::PrintError("abort: %s\n", reinterpret_cast<char*>(args[0]) +
11946 Smi::cast(args[1])->value()); 11638 Smi::cast(args[1])->value());
11947 isolate->PrintStack(); 11639 isolate->PrintStack();
11948 OS::Abort(); 11640 OS::Abort();
11949 UNREACHABLE(); 11641 UNREACHABLE();
11950 return NULL; 11642 return NULL;
11951 } 11643 }
11952 11644
11953 11645
11954 static MaybeObject* Runtime_GetFromCache(RUNTIME_CALLING_CONVENTION) { 11646 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFromCache) {
11955 RUNTIME_GET_ISOLATE;
11956 // This is only called from codegen, so checks might be more lax. 11647 // This is only called from codegen, so checks might be more lax.
11957 CONVERT_CHECKED(JSFunctionResultCache, cache, args[0]); 11648 CONVERT_CHECKED(JSFunctionResultCache, cache, args[0]);
11958 Object* key = args[1]; 11649 Object* key = args[1];
11959 11650
11960 int finger_index = cache->finger_index(); 11651 int finger_index = cache->finger_index();
11961 Object* o = cache->get(finger_index); 11652 Object* o = cache->get(finger_index);
11962 if (o == key) { 11653 if (o == key) {
11963 // The fastest case: hit the same place again. 11654 // The fastest case: hit the same place again.
11964 return cache->get(finger_index + 1); 11655 return cache->get(finger_index + 1);
11965 } 11656 }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
12037 cache_handle->set_finger_index(index); 11728 cache_handle->set_finger_index(index);
12038 11729
12039 #ifdef DEBUG 11730 #ifdef DEBUG
12040 cache_handle->JSFunctionResultCacheVerify(); 11731 cache_handle->JSFunctionResultCacheVerify();
12041 #endif 11732 #endif
12042 11733
12043 return *value; 11734 return *value;
12044 } 11735 }
12045 11736
12046 11737
12047 static MaybeObject* Runtime_NewMessageObject(RUNTIME_CALLING_CONVENTION) { 11738 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewMessageObject) {
12048 RUNTIME_GET_ISOLATE;
12049 HandleScope scope(isolate); 11739 HandleScope scope(isolate);
12050 CONVERT_ARG_CHECKED(String, type, 0); 11740 CONVERT_ARG_CHECKED(String, type, 0);
12051 CONVERT_ARG_CHECKED(JSArray, arguments, 1); 11741 CONVERT_ARG_CHECKED(JSArray, arguments, 1);
12052 return *isolate->factory()->NewJSMessageObject( 11742 return *isolate->factory()->NewJSMessageObject(
12053 type, 11743 type,
12054 arguments, 11744 arguments,
12055 0, 11745 0,
12056 0, 11746 0,
12057 isolate->factory()->undefined_value(), 11747 isolate->factory()->undefined_value(),
12058 isolate->factory()->undefined_value(), 11748 isolate->factory()->undefined_value(),
12059 isolate->factory()->undefined_value()); 11749 isolate->factory()->undefined_value());
12060 } 11750 }
12061 11751
12062 11752
12063 static MaybeObject* Runtime_MessageGetType(RUNTIME_CALLING_CONVENTION) { 11753 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetType) {
12064 RUNTIME_GET_ISOLATE;
12065 CONVERT_CHECKED(JSMessageObject, message, args[0]); 11754 CONVERT_CHECKED(JSMessageObject, message, args[0]);
12066 return message->type(); 11755 return message->type();
12067 } 11756 }
12068 11757
12069 11758
12070 static MaybeObject* Runtime_MessageGetArguments(RUNTIME_CALLING_CONVENTION) { 11759 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetArguments) {
12071 RUNTIME_GET_ISOLATE;
12072 CONVERT_CHECKED(JSMessageObject, message, args[0]); 11760 CONVERT_CHECKED(JSMessageObject, message, args[0]);
12073 return message->arguments(); 11761 return message->arguments();
12074 } 11762 }
12075 11763
12076 11764
12077 static MaybeObject* Runtime_MessageGetStartPosition( 11765 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetStartPosition) {
12078 RUNTIME_CALLING_CONVENTION) {
12079 RUNTIME_GET_ISOLATE;
12080 CONVERT_CHECKED(JSMessageObject, message, args[0]); 11766 CONVERT_CHECKED(JSMessageObject, message, args[0]);
12081 return Smi::FromInt(message->start_position()); 11767 return Smi::FromInt(message->start_position());
12082 } 11768 }
12083 11769
12084 11770
12085 static MaybeObject* Runtime_MessageGetScript(RUNTIME_CALLING_CONVENTION) { 11771 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetScript) {
12086 RUNTIME_GET_ISOLATE;
12087 CONVERT_CHECKED(JSMessageObject, message, args[0]); 11772 CONVERT_CHECKED(JSMessageObject, message, args[0]);
12088 return message->script(); 11773 return message->script();
12089 } 11774 }
12090 11775
12091 11776
12092 #ifdef DEBUG 11777 #ifdef DEBUG
12093 // ListNatives is ONLY used by the fuzz-natives.js in debug mode 11778 // ListNatives is ONLY used by the fuzz-natives.js in debug mode
12094 // Exclude the code in release mode. 11779 // Exclude the code in release mode.
12095 static MaybeObject* Runtime_ListNatives(RUNTIME_CALLING_CONVENTION) { 11780 RUNTIME_FUNCTION(MaybeObject*, Runtime_ListNatives) {
12096 RUNTIME_GET_ISOLATE;
12097 ASSERT(args.length() == 0); 11781 ASSERT(args.length() == 0);
12098 HandleScope scope; 11782 HandleScope scope;
12099 #define COUNT_ENTRY(Name, argc, ressize) + 1 11783 #define COUNT_ENTRY(Name, argc, ressize) + 1
12100 int entry_count = 0 11784 int entry_count = 0
12101 RUNTIME_FUNCTION_LIST(COUNT_ENTRY) 11785 RUNTIME_FUNCTION_LIST(COUNT_ENTRY)
12102 INLINE_FUNCTION_LIST(COUNT_ENTRY) 11786 INLINE_FUNCTION_LIST(COUNT_ENTRY)
12103 INLINE_RUNTIME_FUNCTION_LIST(COUNT_ENTRY); 11787 INLINE_RUNTIME_FUNCTION_LIST(COUNT_ENTRY);
12104 #undef COUNT_ENTRY 11788 #undef COUNT_ENTRY
12105 Factory* factory = isolate->factory(); 11789 Factory* factory = isolate->factory();
12106 Handle<FixedArray> elements = factory->NewFixedArray(entry_count); 11790 Handle<FixedArray> elements = factory->NewFixedArray(entry_count);
(...skipping 23 matching lines...) Expand all
12130 INLINE_FUNCTION_LIST(ADD_ENTRY) 11814 INLINE_FUNCTION_LIST(ADD_ENTRY)
12131 INLINE_RUNTIME_FUNCTION_LIST(ADD_ENTRY) 11815 INLINE_RUNTIME_FUNCTION_LIST(ADD_ENTRY)
12132 #undef ADD_ENTRY 11816 #undef ADD_ENTRY
12133 ASSERT_EQ(index, entry_count); 11817 ASSERT_EQ(index, entry_count);
12134 Handle<JSArray> result = factory->NewJSArrayWithElements(elements); 11818 Handle<JSArray> result = factory->NewJSArrayWithElements(elements);
12135 return *result; 11819 return *result;
12136 } 11820 }
12137 #endif 11821 #endif
12138 11822
12139 11823
12140 static MaybeObject* Runtime_Log(RUNTIME_CALLING_CONVENTION) { 11824 RUNTIME_FUNCTION(MaybeObject*, Runtime_Log) {
12141 RUNTIME_GET_ISOLATE;
12142 ASSERT(args.length() == 2); 11825 ASSERT(args.length() == 2);
12143 CONVERT_CHECKED(String, format, args[0]); 11826 CONVERT_CHECKED(String, format, args[0]);
12144 CONVERT_CHECKED(JSArray, elms, args[1]); 11827 CONVERT_CHECKED(JSArray, elms, args[1]);
12145 Vector<const char> chars = format->ToAsciiVector(); 11828 Vector<const char> chars = format->ToAsciiVector();
12146 LOGGER->LogRuntime(chars, elms); 11829 LOGGER->LogRuntime(chars, elms);
12147 return isolate->heap()->undefined_value(); 11830 return isolate->heap()->undefined_value();
12148 } 11831 }
12149 11832
12150 11833
12151 static MaybeObject* Runtime_IS_VAR(RUNTIME_CALLING_CONVENTION) { 11834 RUNTIME_FUNCTION(MaybeObject*, Runtime_IS_VAR) {
12152 UNREACHABLE(); // implemented as macro in the parser 11835 UNREACHABLE(); // implemented as macro in the parser
12153 return NULL; 11836 return NULL;
12154 } 11837 }
12155 11838
12156 11839
12157 // ---------------------------------------------------------------------------- 11840 // ----------------------------------------------------------------------------
12158 // Implementation of Runtime 11841 // Implementation of Runtime
12159 11842
12160 #define F(name, number_of_args, result_size) \ 11843 #define F(name, number_of_args, result_size) \
12161 { Runtime::k##name, Runtime::RUNTIME, #name, \ 11844 { Runtime::k##name, Runtime::RUNTIME, #name, \
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
12227 } else { 11910 } else {
12228 // Handle last resort GC and make sure to allow future allocations 11911 // Handle last resort GC and make sure to allow future allocations
12229 // to grow the heap without causing GCs (if possible). 11912 // to grow the heap without causing GCs (if possible).
12230 isolate->counters()->gc_last_resort_from_js()->Increment(); 11913 isolate->counters()->gc_last_resort_from_js()->Increment();
12231 isolate->heap()->CollectAllGarbage(false); 11914 isolate->heap()->CollectAllGarbage(false);
12232 } 11915 }
12233 } 11916 }
12234 11917
12235 11918
12236 } } // namespace v8::internal 11919 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/ic.cc ('k') | src/stub-cache.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698