| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 | 369 |
| 370 | 370 |
| 371 Handle<Object> GetProperty(Handle<Object> obj, | 371 Handle<Object> GetProperty(Handle<Object> obj, |
| 372 Handle<Object> key) { | 372 Handle<Object> key) { |
| 373 Isolate* isolate = Isolate::Current(); | 373 Isolate* isolate = Isolate::Current(); |
| 374 CALL_HEAP_FUNCTION(isolate, | 374 CALL_HEAP_FUNCTION(isolate, |
| 375 Runtime::GetObjectProperty(isolate, obj, key), Object); | 375 Runtime::GetObjectProperty(isolate, obj, key), Object); |
| 376 } | 376 } |
| 377 | 377 |
| 378 | 378 |
| 379 Handle<Object> GetProperty(Handle<JSReceiver> obj, | |
| 380 Handle<String> name, | |
| 381 LookupResult* result) { | |
| 382 PropertyAttributes attributes; | |
| 383 Isolate* isolate = Isolate::Current(); | |
| 384 CALL_HEAP_FUNCTION(isolate, | |
| 385 obj->GetProperty(*obj, result, *name, &attributes), | |
| 386 Object); | |
| 387 } | |
| 388 | |
| 389 | |
| 390 Handle<Object> GetElement(Handle<Object> obj, | |
| 391 uint32_t index) { | |
| 392 Isolate* isolate = Isolate::Current(); | |
| 393 CALL_HEAP_FUNCTION(isolate, Runtime::GetElement(obj, index), Object); | |
| 394 } | |
| 395 | |
| 396 | |
| 397 Handle<Object> GetPropertyWithInterceptor(Handle<JSObject> receiver, | 379 Handle<Object> GetPropertyWithInterceptor(Handle<JSObject> receiver, |
| 398 Handle<JSObject> holder, | 380 Handle<JSObject> holder, |
| 399 Handle<String> name, | 381 Handle<String> name, |
| 400 PropertyAttributes* attributes) { | 382 PropertyAttributes* attributes) { |
| 401 Isolate* isolate = receiver->GetIsolate(); | 383 Isolate* isolate = receiver->GetIsolate(); |
| 402 CALL_HEAP_FUNCTION(isolate, | 384 CALL_HEAP_FUNCTION(isolate, |
| 403 holder->GetPropertyWithInterceptor(*receiver, | 385 holder->GetPropertyWithInterceptor(*receiver, |
| 404 *name, | 386 *name, |
| 405 attributes), | 387 attributes), |
| 406 Object); | 388 Object); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 uint32_t index, | 479 uint32_t index, |
| 498 Handle<Object> value, | 480 Handle<Object> value, |
| 499 StrictModeFlag strict_mode) { | 481 StrictModeFlag strict_mode) { |
| 500 ASSERT(!object->HasExternalArrayElements()); | 482 ASSERT(!object->HasExternalArrayElements()); |
| 501 CALL_HEAP_FUNCTION(object->GetIsolate(), | 483 CALL_HEAP_FUNCTION(object->GetIsolate(), |
| 502 object->SetElement(index, *value, strict_mode, false), | 484 object->SetElement(index, *value, strict_mode, false), |
| 503 Object); | 485 Object); |
| 504 } | 486 } |
| 505 | 487 |
| 506 | 488 |
| 489 Handle<Object> TransitionElementsKind(Handle<JSObject> object, |
| 490 ElementsKind to_kind) { |
| 491 CALL_HEAP_FUNCTION(object->GetIsolate(), |
| 492 object->TransitionElementsKind(to_kind), |
| 493 Object); |
| 494 } |
| 495 |
| 496 |
| 507 Handle<JSObject> Copy(Handle<JSObject> obj) { | 497 Handle<JSObject> Copy(Handle<JSObject> obj) { |
| 508 Isolate* isolate = obj->GetIsolate(); | 498 Isolate* isolate = obj->GetIsolate(); |
| 509 CALL_HEAP_FUNCTION(isolate, | 499 CALL_HEAP_FUNCTION(isolate, |
| 510 isolate->heap()->CopyJSObject(*obj), JSObject); | 500 isolate->heap()->CopyJSObject(*obj), JSObject); |
| 511 } | 501 } |
| 512 | 502 |
| 513 | 503 |
| 514 Handle<Object> SetAccessor(Handle<JSObject> obj, Handle<AccessorInfo> info) { | 504 Handle<Object> SetAccessor(Handle<JSObject> obj, Handle<AccessorInfo> info) { |
| 515 CALL_HEAP_FUNCTION(obj->GetIsolate(), obj->DefineAccessor(*info), Object); | 505 CALL_HEAP_FUNCTION(obj->GetIsolate(), obj->DefineAccessor(*info), Object); |
| 516 } | 506 } |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 694 return line; | 684 return line; |
| 695 } | 685 } |
| 696 | 686 |
| 697 | 687 |
| 698 void CustomArguments::IterateInstance(ObjectVisitor* v) { | 688 void CustomArguments::IterateInstance(ObjectVisitor* v) { |
| 699 v->VisitPointers(values_, values_ + ARRAY_SIZE(values_)); | 689 v->VisitPointers(values_, values_ + ARRAY_SIZE(values_)); |
| 700 } | 690 } |
| 701 | 691 |
| 702 | 692 |
| 703 // Compute the property keys from the interceptor. | 693 // Compute the property keys from the interceptor. |
| 704 v8::Handle<v8::Array> GetKeysForNamedInterceptor(Handle<JSObject> receiver, | 694 v8::Handle<v8::Array> GetKeysForNamedInterceptor(Handle<JSReceiver> receiver, |
| 705 Handle<JSObject> object) { | 695 Handle<JSObject> object) { |
| 706 Isolate* isolate = receiver->GetIsolate(); | 696 Isolate* isolate = receiver->GetIsolate(); |
| 707 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); | 697 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); |
| 708 CustomArguments args(isolate, interceptor->data(), *receiver, *object); | 698 CustomArguments args(isolate, interceptor->data(), *receiver, *object); |
| 709 v8::AccessorInfo info(args.end()); | 699 v8::AccessorInfo info(args.end()); |
| 710 v8::Handle<v8::Array> result; | 700 v8::Handle<v8::Array> result; |
| 711 if (!interceptor->enumerator()->IsUndefined()) { | 701 if (!interceptor->enumerator()->IsUndefined()) { |
| 712 v8::NamedPropertyEnumerator enum_fun = | 702 v8::NamedPropertyEnumerator enum_fun = |
| 713 v8::ToCData<v8::NamedPropertyEnumerator>(interceptor->enumerator()); | 703 v8::ToCData<v8::NamedPropertyEnumerator>(interceptor->enumerator()); |
| 714 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); | 704 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); |
| 715 { | 705 { |
| 716 // Leaving JavaScript. | 706 // Leaving JavaScript. |
| 717 VMState state(isolate, EXTERNAL); | 707 VMState state(isolate, EXTERNAL); |
| 718 result = enum_fun(info); | 708 result = enum_fun(info); |
| 719 } | 709 } |
| 720 } | 710 } |
| 721 return result; | 711 return result; |
| 722 } | 712 } |
| 723 | 713 |
| 724 | 714 |
| 725 // Compute the element keys from the interceptor. | 715 // Compute the element keys from the interceptor. |
| 726 v8::Handle<v8::Array> GetKeysForIndexedInterceptor(Handle<JSObject> receiver, | 716 v8::Handle<v8::Array> GetKeysForIndexedInterceptor(Handle<JSReceiver> receiver, |
| 727 Handle<JSObject> object) { | 717 Handle<JSObject> object) { |
| 728 Isolate* isolate = receiver->GetIsolate(); | 718 Isolate* isolate = receiver->GetIsolate(); |
| 729 Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor()); | 719 Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor()); |
| 730 CustomArguments args(isolate, interceptor->data(), *receiver, *object); | 720 CustomArguments args(isolate, interceptor->data(), *receiver, *object); |
| 731 v8::AccessorInfo info(args.end()); | 721 v8::AccessorInfo info(args.end()); |
| 732 v8::Handle<v8::Array> result; | 722 v8::Handle<v8::Array> result; |
| 733 if (!interceptor->enumerator()->IsUndefined()) { | 723 if (!interceptor->enumerator()->IsUndefined()) { |
| 734 v8::IndexedPropertyEnumerator enum_fun = | 724 v8::IndexedPropertyEnumerator enum_fun = |
| 735 v8::ToCData<v8::IndexedPropertyEnumerator>(interceptor->enumerator()); | 725 v8::ToCData<v8::IndexedPropertyEnumerator>(interceptor->enumerator()); |
| 736 LOG(isolate, ApiObjectAccess("interceptor-indexed-enum", *object)); | 726 LOG(isolate, ApiObjectAccess("interceptor-indexed-enum", *object)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 747 static bool ContainsOnlyValidKeys(Handle<FixedArray> array) { | 737 static bool ContainsOnlyValidKeys(Handle<FixedArray> array) { |
| 748 int len = array->length(); | 738 int len = array->length(); |
| 749 for (int i = 0; i < len; i++) { | 739 for (int i = 0; i < len; i++) { |
| 750 Object* e = array->get(i); | 740 Object* e = array->get(i); |
| 751 if (!(e->IsString() || e->IsNumber())) return false; | 741 if (!(e->IsString() || e->IsNumber())) return false; |
| 752 } | 742 } |
| 753 return true; | 743 return true; |
| 754 } | 744 } |
| 755 | 745 |
| 756 | 746 |
| 757 Handle<FixedArray> GetKeysInFixedArrayFor(Handle<JSObject> object, | 747 Handle<FixedArray> GetKeysInFixedArrayFor(Handle<JSReceiver> object, |
| 758 KeyCollectionType type) { | 748 KeyCollectionType type, |
| 749 bool* threw) { |
| 759 USE(ContainsOnlyValidKeys); | 750 USE(ContainsOnlyValidKeys); |
| 760 Isolate* isolate = object->GetIsolate(); | 751 Isolate* isolate = object->GetIsolate(); |
| 761 Handle<FixedArray> content = isolate->factory()->empty_fixed_array(); | 752 Handle<FixedArray> content = isolate->factory()->empty_fixed_array(); |
| 762 Handle<JSObject> arguments_boilerplate = Handle<JSObject>( | 753 Handle<JSObject> arguments_boilerplate = Handle<JSObject>( |
| 763 isolate->context()->global_context()->arguments_boilerplate(), | 754 isolate->context()->global_context()->arguments_boilerplate(), |
| 764 isolate); | 755 isolate); |
| 765 Handle<JSFunction> arguments_function = Handle<JSFunction>( | 756 Handle<JSFunction> arguments_function = Handle<JSFunction>( |
| 766 JSFunction::cast(arguments_boilerplate->map()->constructor()), | 757 JSFunction::cast(arguments_boilerplate->map()->constructor()), |
| 767 isolate); | 758 isolate); |
| 768 | 759 |
| 769 // Only collect keys if access is permitted. | 760 // Only collect keys if access is permitted. |
| 770 for (Handle<Object> p = object; | 761 for (Handle<Object> p = object; |
| 771 *p != isolate->heap()->null_value(); | 762 *p != isolate->heap()->null_value(); |
| 772 p = Handle<Object>(p->GetPrototype(), isolate)) { | 763 p = Handle<Object>(p->GetPrototype(), isolate)) { |
| 764 if (p->IsJSProxy()) { |
| 765 Handle<JSProxy> proxy(JSProxy::cast(*p), isolate); |
| 766 Handle<Object> args[] = { proxy }; |
| 767 Handle<Object> names = Execution::Call( |
| 768 isolate->proxy_enumerate(), object, ARRAY_SIZE(args), args, threw); |
| 769 if (*threw) return content; |
| 770 content = AddKeysFromJSArray(content, Handle<JSArray>::cast(names)); |
| 771 break; |
| 772 } |
| 773 |
| 773 Handle<JSObject> current(JSObject::cast(*p), isolate); | 774 Handle<JSObject> current(JSObject::cast(*p), isolate); |
| 774 | 775 |
| 775 // Check access rights if required. | 776 // Check access rights if required. |
| 776 if (current->IsAccessCheckNeeded() && | 777 if (current->IsAccessCheckNeeded() && |
| 777 !isolate->MayNamedAccess(*current, | 778 !isolate->MayNamedAccess(*current, |
| 778 isolate->heap()->undefined_value(), | 779 isolate->heap()->undefined_value(), |
| 779 v8::ACCESS_KEYS)) { | 780 v8::ACCESS_KEYS)) { |
| 780 isolate->ReportFailedAccessCheck(*current, v8::ACCESS_KEYS); | 781 isolate->ReportFailedAccessCheck(*current, v8::ACCESS_KEYS); |
| 781 break; | 782 break; |
| 782 } | 783 } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 829 | 830 |
| 830 // If we only want local properties we bail out after the first | 831 // If we only want local properties we bail out after the first |
| 831 // iteration. | 832 // iteration. |
| 832 if (type == LOCAL_ONLY) | 833 if (type == LOCAL_ONLY) |
| 833 break; | 834 break; |
| 834 } | 835 } |
| 835 return content; | 836 return content; |
| 836 } | 837 } |
| 837 | 838 |
| 838 | 839 |
| 839 Handle<JSArray> GetKeysFor(Handle<JSObject> object) { | 840 Handle<JSArray> GetKeysFor(Handle<JSReceiver> object, bool* threw) { |
| 840 Isolate* isolate = object->GetIsolate(); | 841 Isolate* isolate = object->GetIsolate(); |
| 841 isolate->counters()->for_in()->Increment(); | 842 isolate->counters()->for_in()->Increment(); |
| 842 Handle<FixedArray> elements = GetKeysInFixedArrayFor(object, | 843 Handle<FixedArray> elements = |
| 843 INCLUDE_PROTOS); | 844 GetKeysInFixedArrayFor(object, INCLUDE_PROTOS, threw); |
| 844 return isolate->factory()->NewJSArrayWithElements(elements); | 845 return isolate->factory()->NewJSArrayWithElements(elements); |
| 845 } | 846 } |
| 846 | 847 |
| 847 | 848 |
| 848 Handle<FixedArray> GetEnumPropertyKeys(Handle<JSObject> object, | 849 Handle<FixedArray> GetEnumPropertyKeys(Handle<JSObject> object, |
| 849 bool cache_result) { | 850 bool cache_result) { |
| 850 int index = 0; | 851 int index = 0; |
| 851 Isolate* isolate = object->GetIsolate(); | 852 Isolate* isolate = object->GetIsolate(); |
| 852 if (object->HasFastProperties()) { | 853 if (object->HasFastProperties()) { |
| 853 if (object->map()->instance_descriptors()->HasEnumCache()) { | 854 if (object->map()->instance_descriptors()->HasEnumCache()) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 883 } else { | 884 } else { |
| 884 int num_enum = object->NumberOfEnumProperties(); | 885 int num_enum = object->NumberOfEnumProperties(); |
| 885 Handle<FixedArray> storage = isolate->factory()->NewFixedArray(num_enum); | 886 Handle<FixedArray> storage = isolate->factory()->NewFixedArray(num_enum); |
| 886 Handle<FixedArray> sort_array = isolate->factory()->NewFixedArray(num_enum); | 887 Handle<FixedArray> sort_array = isolate->factory()->NewFixedArray(num_enum); |
| 887 object->property_dictionary()->CopyEnumKeysTo(*storage, *sort_array); | 888 object->property_dictionary()->CopyEnumKeysTo(*storage, *sort_array); |
| 888 return storage; | 889 return storage; |
| 889 } | 890 } |
| 890 } | 891 } |
| 891 | 892 |
| 892 | 893 |
| 894 Handle<ObjectHashSet> ObjectHashSetAdd(Handle<ObjectHashSet> table, |
| 895 Handle<Object> key) { |
| 896 CALL_HEAP_FUNCTION(table->GetIsolate(), |
| 897 table->Add(*key), |
| 898 ObjectHashSet); |
| 899 } |
| 900 |
| 901 |
| 902 Handle<ObjectHashSet> ObjectHashSetRemove(Handle<ObjectHashSet> table, |
| 903 Handle<Object> key) { |
| 904 CALL_HEAP_FUNCTION(table->GetIsolate(), |
| 905 table->Remove(*key), |
| 906 ObjectHashSet); |
| 907 } |
| 908 |
| 909 |
| 893 Handle<ObjectHashTable> PutIntoObjectHashTable(Handle<ObjectHashTable> table, | 910 Handle<ObjectHashTable> PutIntoObjectHashTable(Handle<ObjectHashTable> table, |
| 894 Handle<JSReceiver> key, | 911 Handle<Object> key, |
| 895 Handle<Object> value) { | 912 Handle<Object> value) { |
| 896 CALL_HEAP_FUNCTION(table->GetIsolate(), | 913 CALL_HEAP_FUNCTION(table->GetIsolate(), |
| 897 table->Put(*key, *value), | 914 table->Put(*key, *value), |
| 898 ObjectHashTable); | 915 ObjectHashTable); |
| 899 } | 916 } |
| 900 | 917 |
| 901 | 918 |
| 902 bool EnsureCompiled(Handle<SharedFunctionInfo> shared, | |
| 903 ClearExceptionFlag flag) { | |
| 904 return shared->is_compiled() || CompileLazyShared(shared, flag); | |
| 905 } | |
| 906 | |
| 907 | |
| 908 static bool CompileLazyHelper(CompilationInfo* info, | |
| 909 ClearExceptionFlag flag) { | |
| 910 // Compile the source information to a code object. | |
| 911 ASSERT(info->IsOptimizing() || !info->shared_info()->is_compiled()); | |
| 912 ASSERT(!info->isolate()->has_pending_exception()); | |
| 913 bool result = Compiler::CompileLazy(info); | |
| 914 ASSERT(result != Isolate::Current()->has_pending_exception()); | |
| 915 if (!result && flag == CLEAR_EXCEPTION) { | |
| 916 info->isolate()->clear_pending_exception(); | |
| 917 } | |
| 918 return result; | |
| 919 } | |
| 920 | |
| 921 | |
| 922 bool CompileLazyShared(Handle<SharedFunctionInfo> shared, | |
| 923 ClearExceptionFlag flag) { | |
| 924 CompilationInfo info(shared); | |
| 925 return CompileLazyHelper(&info, flag); | |
| 926 } | |
| 927 | |
| 928 | |
| 929 bool CompileLazy(Handle<JSFunction> function, ClearExceptionFlag flag) { | |
| 930 bool result = true; | |
| 931 if (function->shared()->is_compiled()) { | |
| 932 function->ReplaceCode(function->shared()->code()); | |
| 933 function->shared()->set_code_age(0); | |
| 934 } else { | |
| 935 CompilationInfo info(function); | |
| 936 result = CompileLazyHelper(&info, flag); | |
| 937 ASSERT(!result || function->is_compiled()); | |
| 938 } | |
| 939 return result; | |
| 940 } | |
| 941 | |
| 942 | |
| 943 bool CompileOptimized(Handle<JSFunction> function, | |
| 944 int osr_ast_id, | |
| 945 ClearExceptionFlag flag) { | |
| 946 CompilationInfo info(function); | |
| 947 info.SetOptimizing(osr_ast_id); | |
| 948 return CompileLazyHelper(&info, flag); | |
| 949 } | |
| 950 | |
| 951 } } // namespace v8::internal | 919 } } // namespace v8::internal |
| OLD | NEW |