OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 #include "scopeinfo.h" | 46 #include "scopeinfo.h" |
47 #include "smart-pointer.h" | 47 #include "smart-pointer.h" |
48 #include "stub-cache.h" | 48 #include "stub-cache.h" |
49 #include "v8threads.h" | 49 #include "v8threads.h" |
50 | 50 |
51 namespace v8 { | 51 namespace v8 { |
52 namespace internal { | 52 namespace internal { |
53 | 53 |
54 | 54 |
55 #define RUNTIME_ASSERT(value) \ | 55 #define RUNTIME_ASSERT(value) \ |
56 if (!(value)) return Top::ThrowIllegalOperation(); | 56 if (!(value)) return Isolate::Current()->ThrowIllegalOperation(); |
57 | 57 |
58 // Cast the given object to a value of the specified type and store | 58 // Cast the given object to a value of the specified type and store |
59 // it in a variable with the given name. If the object is not of the | 59 // it in a variable with the given name. If the object is not of the |
60 // expected type call IllegalOperation and return. | 60 // expected type call IllegalOperation and return. |
61 #define CONVERT_CHECKED(Type, name, obj) \ | 61 #define CONVERT_CHECKED(Type, name, obj) \ |
62 RUNTIME_ASSERT(obj->Is##Type()); \ | 62 RUNTIME_ASSERT(obj->Is##Type()); \ |
63 Type* name = Type::cast(obj); | 63 Type* name = Type::cast(obj); |
64 | 64 |
65 #define CONVERT_ARG_CHECKED(Type, name, index) \ | 65 #define CONVERT_ARG_CHECKED(Type, name, index) \ |
66 RUNTIME_ASSERT(args[index]->Is##Type()); \ | 66 RUNTIME_ASSERT(args[index]->Is##Type()); \ |
(...skipping 26 matching lines...) Expand all Loading... |
93 #define CONVERT_NUMBER_CHECKED(type, name, Type, obj) \ | 93 #define CONVERT_NUMBER_CHECKED(type, name, Type, obj) \ |
94 RUNTIME_ASSERT(obj->IsNumber()); \ | 94 RUNTIME_ASSERT(obj->IsNumber()); \ |
95 type name = NumberTo##Type(obj); | 95 type name = NumberTo##Type(obj); |
96 | 96 |
97 // Non-reentrant string buffer for efficient general use in this file. | 97 // Non-reentrant string buffer for efficient general use in this file. |
98 static StaticResource<StringInputBuffer> runtime_string_input_buffer; | 98 static StaticResource<StringInputBuffer> runtime_string_input_buffer; |
99 | 99 |
100 | 100 |
101 static Object* DeepCopyBoilerplate(Heap* heap, JSObject* boilerplate) { | 101 static Object* DeepCopyBoilerplate(Heap* heap, JSObject* boilerplate) { |
102 StackLimitCheck check; | 102 StackLimitCheck check; |
103 if (check.HasOverflowed()) return Top::StackOverflow(); | 103 if (check.HasOverflowed()) return Isolate::Current()->StackOverflow(); |
104 | 104 |
105 Object* result = heap->CopyJSObject(boilerplate); | 105 Object* result = heap->CopyJSObject(boilerplate); |
106 if (result->IsFailure()) return result; | 106 if (result->IsFailure()) return result; |
107 JSObject* copy = JSObject::cast(result); | 107 JSObject* copy = JSObject::cast(result); |
108 | 108 |
109 // Deep copy local properties. | 109 // Deep copy local properties. |
110 if (copy->HasFastProperties()) { | 110 if (copy->HasFastProperties()) { |
111 FixedArray* properties = copy->properties(); | 111 FixedArray* properties = copy->properties(); |
112 for (int i = 0; i < properties->length(); i++) { | 112 for (int i = 0; i < properties->length(); i++) { |
113 Object* value = properties->get(i); | 113 Object* value = properties->get(i); |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 return HEAP->CopyJSObject(JSObject::cast(*boilerplate)); | 467 return HEAP->CopyJSObject(JSObject::cast(*boilerplate)); |
468 } | 468 } |
469 | 469 |
470 | 470 |
471 static Object* Runtime_CreateCatchExtensionObject(Arguments args) { | 471 static Object* Runtime_CreateCatchExtensionObject(Arguments args) { |
472 ASSERT(args.length() == 2); | 472 ASSERT(args.length() == 2); |
473 CONVERT_CHECKED(String, key, args[0]); | 473 CONVERT_CHECKED(String, key, args[0]); |
474 Object* value = args[1]; | 474 Object* value = args[1]; |
475 // Create a catch context extension object. | 475 // Create a catch context extension object. |
476 JSFunction* constructor = | 476 JSFunction* constructor = |
477 Top::context()->global_context()->context_extension_function(); | 477 Isolate::Current()->context()->global_context()-> |
| 478 context_extension_function(); |
478 Object* object = HEAP->AllocateJSObject(constructor); | 479 Object* object = HEAP->AllocateJSObject(constructor); |
479 if (object->IsFailure()) return object; | 480 if (object->IsFailure()) return object; |
480 // Assign the exception value to the catch variable and make sure | 481 // Assign the exception value to the catch variable and make sure |
481 // that the catch variable is DontDelete. | 482 // that the catch variable is DontDelete. |
482 value = JSObject::cast(object)->SetProperty(key, value, DONT_DELETE); | 483 value = JSObject::cast(object)->SetProperty(key, value, DONT_DELETE); |
483 if (value->IsFailure()) return value; | 484 if (value->IsFailure()) return value; |
484 return object; | 485 return object; |
485 } | 486 } |
486 | 487 |
487 | 488 |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 return HEAP->undefined_value(); | 766 return HEAP->undefined_value(); |
766 } | 767 } |
767 | 768 |
768 | 769 |
769 static Object* ThrowRedeclarationError(const char* type, Handle<String> name) { | 770 static Object* ThrowRedeclarationError(const char* type, Handle<String> name) { |
770 HandleScope scope; | 771 HandleScope scope; |
771 Handle<Object> type_handle = Factory::NewStringFromAscii(CStrVector(type)); | 772 Handle<Object> type_handle = Factory::NewStringFromAscii(CStrVector(type)); |
772 Handle<Object> args[2] = { type_handle, name }; | 773 Handle<Object> args[2] = { type_handle, name }; |
773 Handle<Object> error = | 774 Handle<Object> error = |
774 Factory::NewTypeError("redeclaration", HandleVector(args, 2)); | 775 Factory::NewTypeError("redeclaration", HandleVector(args, 2)); |
775 return Top::Throw(*error); | 776 return Isolate::Current()->Throw(*error); |
776 } | 777 } |
777 | 778 |
778 | 779 |
779 static Object* Runtime_DeclareGlobals(Arguments args) { | 780 static Object* Runtime_DeclareGlobals(Arguments args) { |
780 HandleScope scope; | 781 HandleScope scope; |
781 Handle<GlobalObject> global = Handle<GlobalObject>(Top::context()->global()); | 782 Handle<GlobalObject> global = Handle<GlobalObject>( |
| 783 Isolate::Current()->context()->global()); |
782 | 784 |
783 Handle<Context> context = args.at<Context>(0); | 785 Handle<Context> context = args.at<Context>(0); |
784 CONVERT_ARG_CHECKED(FixedArray, pairs, 1); | 786 CONVERT_ARG_CHECKED(FixedArray, pairs, 1); |
785 bool is_eval = Smi::cast(args[2])->value() == 1; | 787 bool is_eval = Smi::cast(args[2])->value() == 1; |
786 | 788 |
787 // Compute the property attributes. According to ECMA-262, section | 789 // Compute the property attributes. According to ECMA-262, section |
788 // 13, page 71, the property must be read-only and | 790 // 13, page 71, the property must be read-only and |
789 // non-deletable. However, neither SpiderMonkey nor KJS creates the | 791 // non-deletable. However, neither SpiderMonkey nor KJS creates the |
790 // property as read-only, so we don't either. | 792 // property as read-only, so we don't either. |
791 PropertyAttributes base = is_eval ? NONE : DONT_DELETE; | 793 PropertyAttributes base = is_eval ? NONE : DONT_DELETE; |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
944 // The property is not in the function context. It needs to be | 946 // The property is not in the function context. It needs to be |
945 // "declared" in the function context's extension context, or in the | 947 // "declared" in the function context's extension context, or in the |
946 // global context. | 948 // global context. |
947 Handle<JSObject> context_ext; | 949 Handle<JSObject> context_ext; |
948 if (context->has_extension()) { | 950 if (context->has_extension()) { |
949 // The function context's extension context exists - use it. | 951 // The function context's extension context exists - use it. |
950 context_ext = Handle<JSObject>(context->extension()); | 952 context_ext = Handle<JSObject>(context->extension()); |
951 } else { | 953 } else { |
952 // The function context's extension context does not exists - allocate | 954 // The function context's extension context does not exists - allocate |
953 // it. | 955 // it. |
954 context_ext = Factory::NewJSObject(Top::context_extension_function()); | 956 context_ext = Factory::NewJSObject( |
| 957 Isolate::Current()->context_extension_function()); |
955 // And store it in the extension slot. | 958 // And store it in the extension slot. |
956 context->set_extension(*context_ext); | 959 context->set_extension(*context_ext); |
957 } | 960 } |
958 ASSERT(*context_ext != NULL); | 961 ASSERT(*context_ext != NULL); |
959 | 962 |
960 // Declare the property by setting it to the initial value if provided, | 963 // Declare the property by setting it to the initial value if provided, |
961 // or undefined, and use the correct mode (e.g. READ_ONLY attribute for | 964 // or undefined, and use the correct mode (e.g. READ_ONLY attribute for |
962 // constant declarations). | 965 // constant declarations). |
963 ASSERT(!context_ext->HasLocalProperty(*name)); | 966 ASSERT(!context_ext->HasLocalProperty(*name)); |
964 Handle<Object> value(HEAP->undefined_value()); | 967 Handle<Object> value(HEAP->undefined_value()); |
965 if (*initial_value != NULL) value = initial_value; | 968 if (*initial_value != NULL) value = initial_value; |
966 SetProperty(context_ext, name, value, mode); | 969 SetProperty(context_ext, name, value, mode); |
967 ASSERT(context_ext->GetLocalPropertyAttribute(*name) == mode); | 970 ASSERT(context_ext->GetLocalPropertyAttribute(*name) == mode); |
968 } | 971 } |
969 | 972 |
970 return HEAP->undefined_value(); | 973 return HEAP->undefined_value(); |
971 } | 974 } |
972 | 975 |
973 | 976 |
974 static Object* Runtime_InitializeVarGlobal(Arguments args) { | 977 static Object* Runtime_InitializeVarGlobal(Arguments args) { |
975 NoHandleAllocation nha; | 978 NoHandleAllocation nha; |
976 | 979 |
977 // Determine if we need to assign to the variable if it already | 980 // Determine if we need to assign to the variable if it already |
978 // exists (based on the number of arguments). | 981 // exists (based on the number of arguments). |
979 RUNTIME_ASSERT(args.length() == 1 || args.length() == 2); | 982 RUNTIME_ASSERT(args.length() == 1 || args.length() == 2); |
980 bool assign = args.length() == 2; | 983 bool assign = args.length() == 2; |
981 | 984 |
982 CONVERT_ARG_CHECKED(String, name, 0); | 985 CONVERT_ARG_CHECKED(String, name, 0); |
983 GlobalObject* global = Top::context()->global(); | 986 GlobalObject* global = Isolate::Current()->context()->global(); |
984 | 987 |
985 // According to ECMA-262, section 12.2, page 62, the property must | 988 // According to ECMA-262, section 12.2, page 62, the property must |
986 // not be deletable. | 989 // not be deletable. |
987 PropertyAttributes attributes = DONT_DELETE; | 990 PropertyAttributes attributes = DONT_DELETE; |
988 | 991 |
989 // Lookup the property locally in the global object. If it isn't | 992 // Lookup the property locally in the global object. If it isn't |
990 // there, there is a property with this name in the prototype chain. | 993 // there, there is a property with this name in the prototype chain. |
991 // We follow Safari and Firefox behavior and only set the property | 994 // We follow Safari and Firefox behavior and only set the property |
992 // locally if there is an explicit initialization value that we have | 995 // locally if there is an explicit initialization value that we have |
993 // to assign to the property. When adding the property we take | 996 // to assign to the property. When adding the property we take |
994 // special precautions to always add it as a local property even in | 997 // special precautions to always add it as a local property even in |
995 // case of callbacks in the prototype chain (this rules out using | 998 // case of callbacks in the prototype chain (this rules out using |
996 // SetProperty). We have IgnoreAttributesAndSetLocalProperty for | 999 // SetProperty). We have IgnoreAttributesAndSetLocalProperty for |
997 // this. | 1000 // this. |
998 // Note that objects can have hidden prototypes, so we need to traverse | 1001 // Note that objects can have hidden prototypes, so we need to traverse |
999 // the whole chain of hidden prototypes to do a 'local' lookup. | 1002 // the whole chain of hidden prototypes to do a 'local' lookup. |
1000 JSObject* real_holder = global; | 1003 JSObject* real_holder = global; |
1001 LookupResult lookup; | 1004 LookupResult lookup; |
1002 while (true) { | 1005 while (true) { |
1003 real_holder->LocalLookup(*name, &lookup); | 1006 real_holder->LocalLookup(*name, &lookup); |
1004 if (lookup.IsProperty()) { | 1007 if (lookup.IsProperty()) { |
1005 // Determine if this is a redeclaration of something read-only. | 1008 // Determine if this is a redeclaration of something read-only. |
1006 if (lookup.IsReadOnly()) { | 1009 if (lookup.IsReadOnly()) { |
1007 // If we found readonly property on one of hidden prototypes, | 1010 // If we found readonly property on one of hidden prototypes, |
1008 // just shadow it. | 1011 // just shadow it. |
1009 if (real_holder != Top::context()->global()) break; | 1012 if (real_holder != Isolate::Current()->context()->global()) break; |
1010 return ThrowRedeclarationError("const", name); | 1013 return ThrowRedeclarationError("const", name); |
1011 } | 1014 } |
1012 | 1015 |
1013 // Determine if this is a redeclaration of an intercepted read-only | 1016 // Determine if this is a redeclaration of an intercepted read-only |
1014 // property and figure out if the property exists at all. | 1017 // property and figure out if the property exists at all. |
1015 bool found = true; | 1018 bool found = true; |
1016 PropertyType type = lookup.type(); | 1019 PropertyType type = lookup.type(); |
1017 if (type == INTERCEPTOR) { | 1020 if (type == INTERCEPTOR) { |
1018 HandleScope handle_scope; | 1021 HandleScope handle_scope; |
1019 Handle<JSObject> holder(real_holder); | 1022 Handle<JSObject> holder(real_holder); |
1020 PropertyAttributes intercepted = holder->GetPropertyAttribute(*name); | 1023 PropertyAttributes intercepted = holder->GetPropertyAttribute(*name); |
1021 real_holder = *holder; | 1024 real_holder = *holder; |
1022 if (intercepted == ABSENT) { | 1025 if (intercepted == ABSENT) { |
1023 // The interceptor claims the property isn't there. We need to | 1026 // The interceptor claims the property isn't there. We need to |
1024 // make sure to introduce it. | 1027 // make sure to introduce it. |
1025 found = false; | 1028 found = false; |
1026 } else if ((intercepted & READ_ONLY) != 0) { | 1029 } else if ((intercepted & READ_ONLY) != 0) { |
1027 // The property is present, but read-only. Since we're trying to | 1030 // The property is present, but read-only. Since we're trying to |
1028 // overwrite it with a variable declaration we must throw a | 1031 // overwrite it with a variable declaration we must throw a |
1029 // re-declaration error. However if we found readonly property | 1032 // re-declaration error. However if we found readonly property |
1030 // on one of hidden prototypes, just shadow it. | 1033 // on one of hidden prototypes, just shadow it. |
1031 if (real_holder != Top::context()->global()) break; | 1034 if (real_holder != Isolate::Current()->context()->global()) break; |
1032 return ThrowRedeclarationError("const", name); | 1035 return ThrowRedeclarationError("const", name); |
1033 } | 1036 } |
1034 } | 1037 } |
1035 | 1038 |
1036 if (found && !assign) { | 1039 if (found && !assign) { |
1037 // The global property is there and we're not assigning any value | 1040 // The global property is there and we're not assigning any value |
1038 // to it. Just return. | 1041 // to it. Just return. |
1039 return HEAP->undefined_value(); | 1042 return HEAP->undefined_value(); |
1040 } | 1043 } |
1041 | 1044 |
1042 // Assign the value (or undefined) to the property. | 1045 // Assign the value (or undefined) to the property. |
1043 Object* value = (assign) ? args[1] : HEAP->undefined_value(); | 1046 Object* value = (assign) ? args[1] : HEAP->undefined_value(); |
1044 return real_holder->SetProperty(&lookup, *name, value, attributes); | 1047 return real_holder->SetProperty(&lookup, *name, value, attributes); |
1045 } | 1048 } |
1046 | 1049 |
1047 Object* proto = real_holder->GetPrototype(); | 1050 Object* proto = real_holder->GetPrototype(); |
1048 if (!proto->IsJSObject()) | 1051 if (!proto->IsJSObject()) |
1049 break; | 1052 break; |
1050 | 1053 |
1051 if (!JSObject::cast(proto)->map()->is_hidden_prototype()) | 1054 if (!JSObject::cast(proto)->map()->is_hidden_prototype()) |
1052 break; | 1055 break; |
1053 | 1056 |
1054 real_holder = JSObject::cast(proto); | 1057 real_holder = JSObject::cast(proto); |
1055 } | 1058 } |
1056 | 1059 |
1057 global = Top::context()->global(); | 1060 global = Isolate::Current()->context()->global(); |
1058 if (assign) { | 1061 if (assign) { |
1059 return global->IgnoreAttributesAndSetLocalProperty(*name, | 1062 return global->IgnoreAttributesAndSetLocalProperty(*name, |
1060 args[1], | 1063 args[1], |
1061 attributes); | 1064 attributes); |
1062 } | 1065 } |
1063 return HEAP->undefined_value(); | 1066 return HEAP->undefined_value(); |
1064 } | 1067 } |
1065 | 1068 |
1066 | 1069 |
1067 static Object* Runtime_InitializeConstGlobal(Arguments args) { | 1070 static Object* Runtime_InitializeConstGlobal(Arguments args) { |
1068 // All constants are declared with an initial value. The name | 1071 // All constants are declared with an initial value. The name |
1069 // of the constant is the first argument and the initial value | 1072 // of the constant is the first argument and the initial value |
1070 // is the second. | 1073 // is the second. |
1071 RUNTIME_ASSERT(args.length() == 2); | 1074 RUNTIME_ASSERT(args.length() == 2); |
1072 CONVERT_ARG_CHECKED(String, name, 0); | 1075 CONVERT_ARG_CHECKED(String, name, 0); |
1073 Handle<Object> value = args.at<Object>(1); | 1076 Handle<Object> value = args.at<Object>(1); |
1074 | 1077 |
1075 // Get the current global object from top. | 1078 // Get the current global object from top. |
1076 GlobalObject* global = Top::context()->global(); | 1079 GlobalObject* global = Isolate::Current()->context()->global(); |
1077 | 1080 |
1078 // According to ECMA-262, section 12.2, page 62, the property must | 1081 // According to ECMA-262, section 12.2, page 62, the property must |
1079 // not be deletable. Since it's a const, it must be READ_ONLY too. | 1082 // not be deletable. Since it's a const, it must be READ_ONLY too. |
1080 PropertyAttributes attributes = | 1083 PropertyAttributes attributes = |
1081 static_cast<PropertyAttributes>(DONT_DELETE | READ_ONLY); | 1084 static_cast<PropertyAttributes>(DONT_DELETE | READ_ONLY); |
1082 | 1085 |
1083 // Lookup the property locally in the global object. If it isn't | 1086 // Lookup the property locally in the global object. If it isn't |
1084 // there, we add the property and take special precautions to always | 1087 // there, we add the property and take special precautions to always |
1085 // add it as a local property even in case of callbacks in the | 1088 // add it as a local property even in case of callbacks in the |
1086 // prototype chain (this rules out using SetProperty). | 1089 // prototype chain (this rules out using SetProperty). |
(...skipping 18 matching lines...) Expand all Loading... |
1105 | 1108 |
1106 // Throw re-declaration error if the intercepted property is present | 1109 // Throw re-declaration error if the intercepted property is present |
1107 // but not read-only. | 1110 // but not read-only. |
1108 if (intercepted != ABSENT && (intercepted & READ_ONLY) == 0) { | 1111 if (intercepted != ABSENT && (intercepted & READ_ONLY) == 0) { |
1109 return ThrowRedeclarationError("var", name); | 1112 return ThrowRedeclarationError("var", name); |
1110 } | 1113 } |
1111 | 1114 |
1112 // Restore global object from context (in case of GC) and continue | 1115 // Restore global object from context (in case of GC) and continue |
1113 // with setting the value because the property is either absent or | 1116 // with setting the value because the property is either absent or |
1114 // read-only. We also have to do redo the lookup. | 1117 // read-only. We also have to do redo the lookup. |
1115 global = Top::context()->global(); | 1118 global = Isolate::Current()->context()->global(); |
1116 | 1119 |
1117 // BUG 1213579: Handle the case where we have to set a read-only | 1120 // BUG 1213579: Handle the case where we have to set a read-only |
1118 // property through an interceptor and only do it if it's | 1121 // property through an interceptor and only do it if it's |
1119 // uninitialized, e.g. the hole. Nirk... | 1122 // uninitialized, e.g. the hole. Nirk... |
1120 global->SetProperty(*name, *value, attributes); | 1123 global->SetProperty(*name, *value, attributes); |
1121 return *value; | 1124 return *value; |
1122 } | 1125 } |
1123 | 1126 |
1124 // Set the value, but only we're assigning the initial value to a | 1127 // Set the value, but only we're assigning the initial value to a |
1125 // constant. For now, we determine this by checking if the | 1128 // constant. For now, we determine this by checking if the |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1190 // The holder is an arguments object. | 1193 // The holder is an arguments object. |
1191 ASSERT((attributes & READ_ONLY) == 0); | 1194 ASSERT((attributes & READ_ONLY) == 0); |
1192 Handle<JSObject>::cast(holder)->SetElement(index, *value); | 1195 Handle<JSObject>::cast(holder)->SetElement(index, *value); |
1193 } | 1196 } |
1194 return *value; | 1197 return *value; |
1195 } | 1198 } |
1196 | 1199 |
1197 // The property could not be found, we introduce it in the global | 1200 // The property could not be found, we introduce it in the global |
1198 // context. | 1201 // context. |
1199 if (attributes == ABSENT) { | 1202 if (attributes == ABSENT) { |
1200 Handle<JSObject> global = Handle<JSObject>(Top::context()->global()); | 1203 Handle<JSObject> global = Handle<JSObject>( |
| 1204 Isolate::Current()->context()->global()); |
1201 SetProperty(global, name, value, NONE); | 1205 SetProperty(global, name, value, NONE); |
1202 return *value; | 1206 return *value; |
1203 } | 1207 } |
1204 | 1208 |
1205 // The property was present in a context extension object. | 1209 // The property was present in a context extension object. |
1206 Handle<JSObject> context_ext = Handle<JSObject>::cast(holder); | 1210 Handle<JSObject> context_ext = Handle<JSObject>::cast(holder); |
1207 | 1211 |
1208 if (*context_ext == context->extension()) { | 1212 if (*context_ext == context->extension()) { |
1209 // This is the property that was introduced by the const | 1213 // This is the property that was introduced by the const |
1210 // declaration. Set it if it hasn't been set before. NOTE: We | 1214 // declaration. Set it if it hasn't been set before. NOTE: We |
(...skipping 22 matching lines...) Expand all Loading... |
1233 } | 1237 } |
1234 } else { | 1238 } else { |
1235 // The property was found in a different context extension object. | 1239 // The property was found in a different context extension object. |
1236 // Set it if it is not a read-only property. | 1240 // Set it if it is not a read-only property. |
1237 if ((attributes & READ_ONLY) == 0) { | 1241 if ((attributes & READ_ONLY) == 0) { |
1238 Handle<Object> set = SetProperty(context_ext, name, value, attributes); | 1242 Handle<Object> set = SetProperty(context_ext, name, value, attributes); |
1239 // Setting a property might throw an exception. Exceptions | 1243 // Setting a property might throw an exception. Exceptions |
1240 // are converted to empty handles in handle operations. We | 1244 // are converted to empty handles in handle operations. We |
1241 // need to convert back to exceptions here. | 1245 // need to convert back to exceptions here. |
1242 if (set.is_null()) { | 1246 if (set.is_null()) { |
1243 ASSERT(Top::has_pending_exception()); | 1247 ASSERT(Isolate::Current()->has_pending_exception()); |
1244 return Failure::Exception(); | 1248 return Failure::Exception(); |
1245 } | 1249 } |
1246 } | 1250 } |
1247 } | 1251 } |
1248 | 1252 |
1249 return *value; | 1253 return *value; |
1250 } | 1254 } |
1251 | 1255 |
1252 | 1256 |
1253 static Object* Runtime_OptimizeObjectForAddingMultipleProperties( | 1257 static Object* Runtime_OptimizeObjectForAddingMultipleProperties( |
(...skipping 28 matching lines...) Expand all Loading... |
1282 last_match_info); | 1286 last_match_info); |
1283 if (result.is_null()) return Failure::Exception(); | 1287 if (result.is_null()) return Failure::Exception(); |
1284 return *result; | 1288 return *result; |
1285 } | 1289 } |
1286 | 1290 |
1287 | 1291 |
1288 static Object* Runtime_RegExpConstructResult(Arguments args) { | 1292 static Object* Runtime_RegExpConstructResult(Arguments args) { |
1289 ASSERT(args.length() == 3); | 1293 ASSERT(args.length() == 3); |
1290 CONVERT_SMI_CHECKED(elements_count, args[0]); | 1294 CONVERT_SMI_CHECKED(elements_count, args[0]); |
1291 if (elements_count > JSArray::kMaxFastElementsLength) { | 1295 if (elements_count > JSArray::kMaxFastElementsLength) { |
1292 return Top::ThrowIllegalOperation(); | 1296 return Isolate::Current()->ThrowIllegalOperation(); |
1293 } | 1297 } |
1294 Object* new_object = HEAP->AllocateFixedArrayWithHoles(elements_count); | 1298 Object* new_object = HEAP->AllocateFixedArrayWithHoles(elements_count); |
1295 if (new_object->IsFailure()) return new_object; | 1299 if (new_object->IsFailure()) return new_object; |
1296 FixedArray* elements = FixedArray::cast(new_object); | 1300 FixedArray* elements = FixedArray::cast(new_object); |
1297 new_object = HEAP->AllocateRaw(JSRegExpResult::kSize, | 1301 new_object = HEAP->AllocateRaw(JSRegExpResult::kSize, |
1298 NEW_SPACE, | 1302 NEW_SPACE, |
1299 OLD_POINTER_SPACE); | 1303 OLD_POINTER_SPACE); |
1300 if (new_object->IsFailure()) return new_object; | 1304 if (new_object->IsFailure()) return new_object; |
1301 { | 1305 { |
1302 AssertNoAllocation no_gc; | 1306 AssertNoAllocation no_gc; |
1303 HandleScope scope; | 1307 HandleScope scope; |
1304 reinterpret_cast<HeapObject*>(new_object)-> | 1308 reinterpret_cast<HeapObject*>(new_object)-> |
1305 set_map(Top::global_context()->regexp_result_map()); | 1309 set_map(Isolate::Current()->global_context()->regexp_result_map()); |
1306 } | 1310 } |
1307 JSArray* array = JSArray::cast(new_object); | 1311 JSArray* array = JSArray::cast(new_object); |
1308 array->set_properties(HEAP->empty_fixed_array()); | 1312 array->set_properties(HEAP->empty_fixed_array()); |
1309 array->set_elements(elements); | 1313 array->set_elements(elements); |
1310 array->set_length(Smi::FromInt(elements_count)); | 1314 array->set_length(Smi::FromInt(elements_count)); |
1311 // Write in-object properties after the length of the array. | 1315 // Write in-object properties after the length of the array. |
1312 array->InObjectPropertyAtPut(JSRegExpResult::kIndexIndex, args[1]); | 1316 array->InObjectPropertyAtPut(JSRegExpResult::kIndexIndex, args[1]); |
1313 array->InObjectPropertyAtPut(JSRegExpResult::kInputIndex, args[2]); | 1317 array->InObjectPropertyAtPut(JSRegExpResult::kInputIndex, args[2]); |
1314 return array; | 1318 return array; |
1315 } | 1319 } |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1410 InstallBuiltin(holder, "slice", Builtins::ArraySlice); | 1414 InstallBuiltin(holder, "slice", Builtins::ArraySlice); |
1411 InstallBuiltin(holder, "splice", Builtins::ArraySplice); | 1415 InstallBuiltin(holder, "splice", Builtins::ArraySplice); |
1412 InstallBuiltin(holder, "concat", Builtins::ArrayConcat); | 1416 InstallBuiltin(holder, "concat", Builtins::ArrayConcat); |
1413 | 1417 |
1414 return *holder; | 1418 return *holder; |
1415 } | 1419 } |
1416 | 1420 |
1417 | 1421 |
1418 static Object* Runtime_GetGlobalReceiver(Arguments args) { | 1422 static Object* Runtime_GetGlobalReceiver(Arguments args) { |
1419 // Returns a real global receiver, not one of builtins object. | 1423 // Returns a real global receiver, not one of builtins object. |
1420 Context* global_context = Top::context()->global()->global_context(); | 1424 Context* global_context = |
| 1425 Isolate::Current()->context()->global()->global_context(); |
1421 return global_context->global()->global_receiver(); | 1426 return global_context->global()->global_receiver(); |
1422 } | 1427 } |
1423 | 1428 |
1424 | 1429 |
1425 static Object* Runtime_MaterializeRegExpLiteral(Arguments args) { | 1430 static Object* Runtime_MaterializeRegExpLiteral(Arguments args) { |
1426 HandleScope scope; | 1431 HandleScope scope; |
1427 ASSERT(args.length() == 4); | 1432 ASSERT(args.length() == 4); |
1428 CONVERT_ARG_CHECKED(FixedArray, literals, 0); | 1433 CONVERT_ARG_CHECKED(FixedArray, literals, 0); |
1429 int index = Smi::cast(args[1])->value(); | 1434 int index = Smi::cast(args[1])->value(); |
1430 Handle<String> pattern = args.at<String>(2); | 1435 Handle<String> pattern = args.at<String>(2); |
1431 Handle<String> flags = args.at<String>(3); | 1436 Handle<String> flags = args.at<String>(3); |
1432 | 1437 |
1433 // Get the RegExp function from the context in the literals array. | 1438 // Get the RegExp function from the context in the literals array. |
1434 // This is the RegExp function from the context in which the | 1439 // This is the RegExp function from the context in which the |
1435 // function was created. We do not use the RegExp function from the | 1440 // function was created. We do not use the RegExp function from the |
1436 // current global context because this might be the RegExp function | 1441 // current global context because this might be the RegExp function |
1437 // from another context which we should not have access to. | 1442 // from another context which we should not have access to. |
1438 Handle<JSFunction> constructor = | 1443 Handle<JSFunction> constructor = |
1439 Handle<JSFunction>( | 1444 Handle<JSFunction>( |
1440 JSFunction::GlobalContextFromLiterals(*literals)->regexp_function()); | 1445 JSFunction::GlobalContextFromLiterals(*literals)->regexp_function()); |
1441 // Compute the regular expression literal. | 1446 // Compute the regular expression literal. |
1442 bool has_pending_exception; | 1447 bool has_pending_exception; |
1443 Handle<Object> regexp = | 1448 Handle<Object> regexp = |
1444 RegExpImpl::CreateRegExpLiteral(constructor, pattern, flags, | 1449 RegExpImpl::CreateRegExpLiteral(constructor, pattern, flags, |
1445 &has_pending_exception); | 1450 &has_pending_exception); |
1446 if (has_pending_exception) { | 1451 if (has_pending_exception) { |
1447 ASSERT(Top::has_pending_exception()); | 1452 ASSERT(Isolate::Current()->has_pending_exception()); |
1448 return Failure::Exception(); | 1453 return Failure::Exception(); |
1449 } | 1454 } |
1450 literals->set(index, *regexp); | 1455 literals->set(index, *regexp); |
1451 return *regexp; | 1456 return *regexp; |
1452 } | 1457 } |
1453 | 1458 |
1454 | 1459 |
1455 static Object* Runtime_FunctionGetName(Arguments args) { | 1460 static Object* Runtime_FunctionGetName(Arguments args) { |
1456 NoHandleAllocation ha; | 1461 NoHandleAllocation ha; |
1457 ASSERT(args.length() == 1); | 1462 ASSERT(args.length() == 1); |
(...skipping 2238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3696 | 3701 |
3697 | 3702 |
3698 Object* Runtime::GetObjectProperty(Handle<Object> object, Handle<Object> key) { | 3703 Object* Runtime::GetObjectProperty(Handle<Object> object, Handle<Object> key) { |
3699 HandleScope scope; | 3704 HandleScope scope; |
3700 | 3705 |
3701 if (object->IsUndefined() || object->IsNull()) { | 3706 if (object->IsUndefined() || object->IsNull()) { |
3702 Handle<Object> args[2] = { key, object }; | 3707 Handle<Object> args[2] = { key, object }; |
3703 Handle<Object> error = | 3708 Handle<Object> error = |
3704 Factory::NewTypeError("non_object_property_load", | 3709 Factory::NewTypeError("non_object_property_load", |
3705 HandleVector(args, 2)); | 3710 HandleVector(args, 2)); |
3706 return Top::Throw(*error); | 3711 return Isolate::Current()->Throw(*error); |
3707 } | 3712 } |
3708 | 3713 |
3709 // Check if the given key is an array index. | 3714 // Check if the given key is an array index. |
3710 uint32_t index; | 3715 uint32_t index; |
3711 if (key->ToArrayIndex(&index)) { | 3716 if (key->ToArrayIndex(&index)) { |
3712 return GetElementOrCharAt(object, index); | 3717 return GetElementOrCharAt(object, index); |
3713 } | 3718 } |
3714 | 3719 |
3715 // Convert the key to a string - possibly by calling back into JavaScript. | 3720 // Convert the key to a string - possibly by calling back into JavaScript. |
3716 Handle<String> name; | 3721 Handle<String> name; |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3898 Handle<Object> key, | 3903 Handle<Object> key, |
3899 Handle<Object> value, | 3904 Handle<Object> value, |
3900 PropertyAttributes attr) { | 3905 PropertyAttributes attr) { |
3901 HandleScope scope; | 3906 HandleScope scope; |
3902 | 3907 |
3903 if (object->IsUndefined() || object->IsNull()) { | 3908 if (object->IsUndefined() || object->IsNull()) { |
3904 Handle<Object> args[2] = { key, object }; | 3909 Handle<Object> args[2] = { key, object }; |
3905 Handle<Object> error = | 3910 Handle<Object> error = |
3906 Factory::NewTypeError("non_object_property_store", | 3911 Factory::NewTypeError("non_object_property_store", |
3907 HandleVector(args, 2)); | 3912 HandleVector(args, 2)); |
3908 return Top::Throw(*error); | 3913 return Isolate::Current()->Throw(*error); |
3909 } | 3914 } |
3910 | 3915 |
3911 // If the object isn't a JavaScript object, we ignore the store. | 3916 // If the object isn't a JavaScript object, we ignore the store. |
3912 if (!object->IsJSObject()) return *value; | 3917 if (!object->IsJSObject()) return *value; |
3913 | 3918 |
3914 Handle<JSObject> js_object = Handle<JSObject>::cast(object); | 3919 Handle<JSObject> js_object = Handle<JSObject>::cast(object); |
3915 | 3920 |
3916 // Check if the given key is an array index. | 3921 // Check if the given key is an array index. |
3917 uint32_t index; | 3922 uint32_t index; |
3918 if (key->ToArrayIndex(&index)) { | 3923 if (key->ToArrayIndex(&index)) { |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4244 if (!args[0]->IsJSObject()) { | 4249 if (!args[0]->IsJSObject()) { |
4245 return HEAP->undefined_value(); | 4250 return HEAP->undefined_value(); |
4246 } | 4251 } |
4247 CONVERT_ARG_CHECKED(JSObject, obj, 0); | 4252 CONVERT_ARG_CHECKED(JSObject, obj, 0); |
4248 | 4253 |
4249 // Skip the global proxy as it has no properties and always delegates to the | 4254 // Skip the global proxy as it has no properties and always delegates to the |
4250 // real global object. | 4255 // real global object. |
4251 if (obj->IsJSGlobalProxy()) { | 4256 if (obj->IsJSGlobalProxy()) { |
4252 // Only collect names if access is permitted. | 4257 // Only collect names if access is permitted. |
4253 if (obj->IsAccessCheckNeeded() && | 4258 if (obj->IsAccessCheckNeeded() && |
4254 !Top::MayNamedAccess(*obj, HEAP->undefined_value(), v8::ACCESS_KEYS)) { | 4259 !Isolate::Current()->MayNamedAccess(*obj, |
4255 Top::ReportFailedAccessCheck(*obj, v8::ACCESS_KEYS); | 4260 HEAP->undefined_value(), |
| 4261 v8::ACCESS_KEYS)) { |
| 4262 Isolate::Current()->ReportFailedAccessCheck(*obj, v8::ACCESS_KEYS); |
4256 return *Factory::NewJSArray(0); | 4263 return *Factory::NewJSArray(0); |
4257 } | 4264 } |
4258 obj = Handle<JSObject>(JSObject::cast(obj->GetPrototype())); | 4265 obj = Handle<JSObject>(JSObject::cast(obj->GetPrototype())); |
4259 } | 4266 } |
4260 | 4267 |
4261 // Find the number of objects making up this. | 4268 // Find the number of objects making up this. |
4262 int length = LocalPrototypeChainLength(*obj); | 4269 int length = LocalPrototypeChainLength(*obj); |
4263 | 4270 |
4264 // Find the number of local properties for each of the objects. | 4271 // Find the number of local properties for each of the objects. |
4265 ScopedVector<int> local_property_count(length); | 4272 ScopedVector<int> local_property_count(length); |
4266 int total_property_count = 0; | 4273 int total_property_count = 0; |
4267 Handle<JSObject> jsproto = obj; | 4274 Handle<JSObject> jsproto = obj; |
4268 for (int i = 0; i < length; i++) { | 4275 for (int i = 0; i < length; i++) { |
4269 // Only collect names if access is permitted. | 4276 // Only collect names if access is permitted. |
4270 if (jsproto->IsAccessCheckNeeded() && | 4277 if (jsproto->IsAccessCheckNeeded() && |
4271 !Top::MayNamedAccess(*jsproto, | 4278 !Isolate::Current()->MayNamedAccess(*jsproto, |
4272 HEAP->undefined_value(), | 4279 HEAP->undefined_value(), |
4273 v8::ACCESS_KEYS)) { | 4280 v8::ACCESS_KEYS)) { |
4274 Top::ReportFailedAccessCheck(*jsproto, v8::ACCESS_KEYS); | 4281 Isolate::Current()->ReportFailedAccessCheck(*jsproto, v8::ACCESS_KEYS); |
4275 return *Factory::NewJSArray(0); | 4282 return *Factory::NewJSArray(0); |
4276 } | 4283 } |
4277 int n; | 4284 int n; |
4278 n = jsproto->NumberOfLocalProperties(static_cast<PropertyAttributes>(NONE)); | 4285 n = jsproto->NumberOfLocalProperties(static_cast<PropertyAttributes>(NONE)); |
4279 local_property_count[i] = n; | 4286 local_property_count[i] = n; |
4280 total_property_count += n; | 4287 total_property_count += n; |
4281 if (i < length - 1) { | 4288 if (i < length - 1) { |
4282 jsproto = Handle<JSObject>(JSObject::cast(jsproto->GetPrototype())); | 4289 jsproto = Handle<JSObject>(JSObject::cast(jsproto->GetPrototype())); |
4283 } | 4290 } |
4284 } | 4291 } |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4437 Handle<Object> converted = | 4444 Handle<Object> converted = |
4438 Execution::ToString(args.at<Object>(0), &exception); | 4445 Execution::ToString(args.at<Object>(0), &exception); |
4439 if (exception) return Failure::Exception(); | 4446 if (exception) return Failure::Exception(); |
4440 Handle<String> key = Handle<String>::cast(converted); | 4447 Handle<String> key = Handle<String>::cast(converted); |
4441 | 4448 |
4442 // Try to convert the string key into an array index. | 4449 // Try to convert the string key into an array index. |
4443 if (key->AsArrayIndex(&index)) { | 4450 if (key->AsArrayIndex(&index)) { |
4444 if (index < n) { | 4451 if (index < n) { |
4445 return frame->GetParameter(index); | 4452 return frame->GetParameter(index); |
4446 } else { | 4453 } else { |
4447 return Top::initial_object_prototype()->GetElement(index); | 4454 return Isolate::Current()->initial_object_prototype()->GetElement(index); |
4448 } | 4455 } |
4449 } | 4456 } |
4450 | 4457 |
4451 // Handle special arguments properties. | 4458 // Handle special arguments properties. |
4452 if (key->Equals(HEAP->length_symbol())) return Smi::FromInt(n); | 4459 if (key->Equals(HEAP->length_symbol())) return Smi::FromInt(n); |
4453 if (key->Equals(HEAP->callee_symbol())) return frame->function(); | 4460 if (key->Equals(HEAP->callee_symbol())) return frame->function(); |
4454 | 4461 |
4455 // Lookup in the initial Object.prototype object. | 4462 // Lookup in the initial Object.prototype object. |
4456 return Top::initial_object_prototype()->GetProperty(*key); | 4463 return Isolate::Current()->initial_object_prototype()->GetProperty(*key); |
4457 } | 4464 } |
4458 | 4465 |
4459 | 4466 |
4460 static Object* Runtime_ToFastProperties(Arguments args) { | 4467 static Object* Runtime_ToFastProperties(Arguments args) { |
4461 HandleScope scope; | 4468 HandleScope scope; |
4462 | 4469 |
4463 ASSERT(args.length() == 1); | 4470 ASSERT(args.length() == 1); |
4464 Handle<Object> object = args.at<Object>(0); | 4471 Handle<Object> object = args.at<Object>(0); |
4465 if (object->IsJSObject()) { | 4472 if (object->IsJSObject()) { |
4466 Handle<JSObject> js_object = Handle<JSObject>::cast(object); | 4473 Handle<JSObject> js_object = Handle<JSObject>::cast(object); |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4683 if (character >= 256) { | 4690 if (character >= 256) { |
4684 escaped_length += 6; | 4691 escaped_length += 6; |
4685 } else if (IsNotEscaped(character)) { | 4692 } else if (IsNotEscaped(character)) { |
4686 escaped_length++; | 4693 escaped_length++; |
4687 } else { | 4694 } else { |
4688 escaped_length += 3; | 4695 escaped_length += 3; |
4689 } | 4696 } |
4690 // We don't allow strings that are longer than a maximal length. | 4697 // We don't allow strings that are longer than a maximal length. |
4691 ASSERT(String::kMaxLength < 0x7fffffff - 6); // Cannot overflow. | 4698 ASSERT(String::kMaxLength < 0x7fffffff - 6); // Cannot overflow. |
4692 if (escaped_length > String::kMaxLength) { | 4699 if (escaped_length > String::kMaxLength) { |
4693 Top::context()->mark_out_of_memory(); | 4700 Isolate::Current()->context()->mark_out_of_memory(); |
4694 return Failure::OutOfMemoryException(); | 4701 return Failure::OutOfMemoryException(); |
4695 } | 4702 } |
4696 } | 4703 } |
4697 } | 4704 } |
4698 // No length change implies no change. Return original string if no change. | 4705 // No length change implies no change. Return original string if no change. |
4699 if (escaped_length == length) { | 4706 if (escaped_length == length) { |
4700 return source; | 4707 return source; |
4701 } | 4708 } |
4702 Object* o = HEAP->AllocateRawAsciiString(escaped_length); | 4709 Object* o = HEAP->AllocateRawAsciiString(escaped_length); |
4703 if (o->IsFailure()) return o; | 4710 if (o->IsFailure()) return o; |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4914 while (buffer->has_more()) { | 4921 while (buffer->has_more()) { |
4915 current = buffer->GetNext(); | 4922 current = buffer->GetNext(); |
4916 // NOTE: we use 0 as the next character here because, while | 4923 // NOTE: we use 0 as the next character here because, while |
4917 // the next character may affect what a character converts to, | 4924 // the next character may affect what a character converts to, |
4918 // it does not in any case affect the length of what it convert | 4925 // it does not in any case affect the length of what it convert |
4919 // to. | 4926 // to. |
4920 int char_length = mapping->get(current, 0, chars); | 4927 int char_length = mapping->get(current, 0, chars); |
4921 if (char_length == 0) char_length = 1; | 4928 if (char_length == 0) char_length = 1; |
4922 current_length += char_length; | 4929 current_length += char_length; |
4923 if (current_length > Smi::kMaxValue) { | 4930 if (current_length > Smi::kMaxValue) { |
4924 Top::context()->mark_out_of_memory(); | 4931 Isolate::Current()->context()->mark_out_of_memory(); |
4925 return Failure::OutOfMemoryException(); | 4932 return Failure::OutOfMemoryException(); |
4926 } | 4933 } |
4927 } | 4934 } |
4928 // Try again with the real length. | 4935 // Try again with the real length. |
4929 return Smi::FromInt(current_length); | 4936 return Smi::FromInt(current_length); |
4930 } else { | 4937 } else { |
4931 for (int j = 0; j < char_length; j++) { | 4938 for (int j = 0; j < char_length; j++) { |
4932 result->Set(i, chars[j]); | 4939 result->Set(i, chars[j]); |
4933 i++; | 4940 i++; |
4934 } | 4941 } |
(...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5534 } | 5541 } |
5535 } | 5542 } |
5536 } | 5543 } |
5537 | 5544 |
5538 | 5545 |
5539 static Object* Runtime_StringBuilderConcat(Arguments args) { | 5546 static Object* Runtime_StringBuilderConcat(Arguments args) { |
5540 NoHandleAllocation ha; | 5547 NoHandleAllocation ha; |
5541 ASSERT(args.length() == 3); | 5548 ASSERT(args.length() == 3); |
5542 CONVERT_CHECKED(JSArray, array, args[0]); | 5549 CONVERT_CHECKED(JSArray, array, args[0]); |
5543 if (!args[1]->IsSmi()) { | 5550 if (!args[1]->IsSmi()) { |
5544 Top::context()->mark_out_of_memory(); | 5551 Isolate::Current()->context()->mark_out_of_memory(); |
5545 return Failure::OutOfMemoryException(); | 5552 return Failure::OutOfMemoryException(); |
5546 } | 5553 } |
5547 int array_length = Smi::cast(args[1])->value(); | 5554 int array_length = Smi::cast(args[1])->value(); |
5548 CONVERT_CHECKED(String, special, args[2]); | 5555 CONVERT_CHECKED(String, special, args[2]); |
5549 | 5556 |
5550 // This assumption is used by the slice encoding in one or two smis. | 5557 // This assumption is used by the slice encoding in one or two smis. |
5551 ASSERT(Smi::kMaxValue >= String::kMaxLength); | 5558 ASSERT(Smi::kMaxValue >= String::kMaxLength); |
5552 | 5559 |
5553 int special_length = special->length(); | 5560 int special_length = special->length(); |
5554 if (!array->HasFastElements()) { | 5561 if (!array->HasFastElements()) { |
5555 return Top::Throw(HEAP->illegal_argument_symbol()); | 5562 return Isolate::Current()->Throw(HEAP->illegal_argument_symbol()); |
5556 } | 5563 } |
5557 FixedArray* fixed_array = FixedArray::cast(array->elements()); | 5564 FixedArray* fixed_array = FixedArray::cast(array->elements()); |
5558 if (fixed_array->length() < array_length) { | 5565 if (fixed_array->length() < array_length) { |
5559 array_length = fixed_array->length(); | 5566 array_length = fixed_array->length(); |
5560 } | 5567 } |
5561 | 5568 |
5562 if (array_length == 0) { | 5569 if (array_length == 0) { |
5563 return HEAP->empty_string(); | 5570 return HEAP->empty_string(); |
5564 } else if (array_length == 1) { | 5571 } else if (array_length == 1) { |
5565 Object* first = fixed_array->get(0); | 5572 Object* first = fixed_array->get(0); |
(...skipping 13 matching lines...) Expand all Loading... |
5579 if (smi_value > 0) { | 5586 if (smi_value > 0) { |
5580 // Position and length encoded in one smi. | 5587 // Position and length encoded in one smi. |
5581 pos = StringBuilderSubstringPosition::decode(smi_value); | 5588 pos = StringBuilderSubstringPosition::decode(smi_value); |
5582 len = StringBuilderSubstringLength::decode(smi_value); | 5589 len = StringBuilderSubstringLength::decode(smi_value); |
5583 } else { | 5590 } else { |
5584 // Position and length encoded in two smis. | 5591 // Position and length encoded in two smis. |
5585 len = -smi_value; | 5592 len = -smi_value; |
5586 // Get the position and check that it is a positive smi. | 5593 // Get the position and check that it is a positive smi. |
5587 i++; | 5594 i++; |
5588 if (i >= array_length) { | 5595 if (i >= array_length) { |
5589 return Top::Throw(HEAP->illegal_argument_symbol()); | 5596 return Isolate::Current()->Throw(HEAP->illegal_argument_symbol()); |
5590 } | 5597 } |
5591 Object* next_smi = fixed_array->get(i); | 5598 Object* next_smi = fixed_array->get(i); |
5592 if (!next_smi->IsSmi()) { | 5599 if (!next_smi->IsSmi()) { |
5593 return Top::Throw(HEAP->illegal_argument_symbol()); | 5600 return Isolate::Current()->Throw(HEAP->illegal_argument_symbol()); |
5594 } | 5601 } |
5595 pos = Smi::cast(next_smi)->value(); | 5602 pos = Smi::cast(next_smi)->value(); |
5596 if (pos < 0) { | 5603 if (pos < 0) { |
5597 return Top::Throw(HEAP->illegal_argument_symbol()); | 5604 return Isolate::Current()->Throw(HEAP->illegal_argument_symbol()); |
5598 } | 5605 } |
5599 } | 5606 } |
5600 ASSERT(pos >= 0); | 5607 ASSERT(pos >= 0); |
5601 ASSERT(len >= 0); | 5608 ASSERT(len >= 0); |
5602 if (pos > special_length || len > special_length - pos) { | 5609 if (pos > special_length || len > special_length - pos) { |
5603 return Top::Throw(HEAP->illegal_argument_symbol()); | 5610 return Isolate::Current()->Throw(HEAP->illegal_argument_symbol()); |
5604 } | 5611 } |
5605 increment = len; | 5612 increment = len; |
5606 } else if (elt->IsString()) { | 5613 } else if (elt->IsString()) { |
5607 String* element = String::cast(elt); | 5614 String* element = String::cast(elt); |
5608 int element_length = element->length(); | 5615 int element_length = element->length(); |
5609 increment = element_length; | 5616 increment = element_length; |
5610 if (ascii && !element->IsAsciiRepresentation()) { | 5617 if (ascii && !element->IsAsciiRepresentation()) { |
5611 ascii = false; | 5618 ascii = false; |
5612 } | 5619 } |
5613 } else { | 5620 } else { |
5614 return Top::Throw(HEAP->illegal_argument_symbol()); | 5621 return Isolate::Current()->Throw(HEAP->illegal_argument_symbol()); |
5615 } | 5622 } |
5616 if (increment > String::kMaxLength - position) { | 5623 if (increment > String::kMaxLength - position) { |
5617 Top::context()->mark_out_of_memory(); | 5624 Isolate::Current()->context()->mark_out_of_memory(); |
5618 return Failure::OutOfMemoryException(); | 5625 return Failure::OutOfMemoryException(); |
5619 } | 5626 } |
5620 position += increment; | 5627 position += increment; |
5621 } | 5628 } |
5622 | 5629 |
5623 int length = position; | 5630 int length = position; |
5624 Object* object; | 5631 Object* object; |
5625 | 5632 |
5626 if (ascii) { | 5633 if (ascii) { |
5627 object = HEAP->AllocateRawAsciiString(length); | 5634 object = HEAP->AllocateRawAsciiString(length); |
(...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6610 HandleScope scope; | 6617 HandleScope scope; |
6611 ASSERT(args.length() == 1); | 6618 ASSERT(args.length() == 1); |
6612 | 6619 |
6613 Handle<Object> constructor = args.at<Object>(0); | 6620 Handle<Object> constructor = args.at<Object>(0); |
6614 | 6621 |
6615 // If the constructor isn't a proper function we throw a type error. | 6622 // If the constructor isn't a proper function we throw a type error. |
6616 if (!constructor->IsJSFunction()) { | 6623 if (!constructor->IsJSFunction()) { |
6617 Vector< Handle<Object> > arguments = HandleVector(&constructor, 1); | 6624 Vector< Handle<Object> > arguments = HandleVector(&constructor, 1); |
6618 Handle<Object> type_error = | 6625 Handle<Object> type_error = |
6619 Factory::NewTypeError("not_constructor", arguments); | 6626 Factory::NewTypeError("not_constructor", arguments); |
6620 return Top::Throw(*type_error); | 6627 return Isolate::Current()->Throw(*type_error); |
6621 } | 6628 } |
6622 | 6629 |
6623 Handle<JSFunction> function = Handle<JSFunction>::cast(constructor); | 6630 Handle<JSFunction> function = Handle<JSFunction>::cast(constructor); |
6624 | 6631 |
6625 // If function should not have prototype, construction is not allowed. In this | 6632 // If function should not have prototype, construction is not allowed. In this |
6626 // case generated code bailouts here, since function has no initial_map. | 6633 // case generated code bailouts here, since function has no initial_map. |
6627 if (!function->should_have_prototype()) { | 6634 if (!function->should_have_prototype()) { |
6628 Vector< Handle<Object> > arguments = HandleVector(&constructor, 1); | 6635 Vector< Handle<Object> > arguments = HandleVector(&constructor, 1); |
6629 Handle<Object> type_error = | 6636 Handle<Object> type_error = |
6630 Factory::NewTypeError("not_constructor", arguments); | 6637 Factory::NewTypeError("not_constructor", arguments); |
6631 return Top::Throw(*type_error); | 6638 return Isolate::Current()->Throw(*type_error); |
6632 } | 6639 } |
6633 | 6640 |
6634 #ifdef ENABLE_DEBUGGER_SUPPORT | 6641 #ifdef ENABLE_DEBUGGER_SUPPORT |
6635 // Handle stepping into constructors if step into is active. | 6642 // Handle stepping into constructors if step into is active. |
6636 if (Debug::StepInActive()) { | 6643 if (Debug::StepInActive()) { |
6637 Debug::HandleStepIn(function, Handle<Object>::null(), 0, true); | 6644 Debug::HandleStepIn(function, Handle<Object>::null(), 0, true); |
6638 } | 6645 } |
6639 #endif | 6646 #endif |
6640 | 6647 |
6641 if (function->has_initial_map()) { | 6648 if (function->has_initial_map()) { |
6642 if (function->initial_map()->instance_type() == JS_FUNCTION_TYPE) { | 6649 if (function->initial_map()->instance_type() == JS_FUNCTION_TYPE) { |
6643 // The 'Function' function ignores the receiver object when | 6650 // The 'Function' function ignores the receiver object when |
6644 // called using 'new' and creates a new JSFunction object that | 6651 // called using 'new' and creates a new JSFunction object that |
6645 // is returned. The receiver object is only used for error | 6652 // is returned. The receiver object is only used for error |
6646 // reporting if an error occurs when constructing the new | 6653 // reporting if an error occurs when constructing the new |
6647 // JSFunction. Factory::NewJSObject() should not be used to | 6654 // JSFunction. Factory::NewJSObject() should not be used to |
6648 // allocate JSFunctions since it does not properly initialize | 6655 // allocate JSFunctions since it does not properly initialize |
6649 // the shared part of the function. Since the receiver is | 6656 // the shared part of the function. Since the receiver is |
6650 // ignored anyway, we use the global object as the receiver | 6657 // ignored anyway, we use the global object as the receiver |
6651 // instead of a new JSFunction object. This way, errors are | 6658 // instead of a new JSFunction object. This way, errors are |
6652 // reported the same way whether or not 'Function' is called | 6659 // reported the same way whether or not 'Function' is called |
6653 // using 'new'. | 6660 // using 'new'. |
6654 return Top::context()->global(); | 6661 return Isolate::Current()->context()->global(); |
6655 } | 6662 } |
6656 } | 6663 } |
6657 | 6664 |
6658 // The function should be compiled for the optimization hints to be available. | 6665 // The function should be compiled for the optimization hints to be available. |
6659 Handle<SharedFunctionInfo> shared(function->shared()); | 6666 Handle<SharedFunctionInfo> shared(function->shared()); |
6660 EnsureCompiled(shared, CLEAR_EXCEPTION); | 6667 EnsureCompiled(shared, CLEAR_EXCEPTION); |
6661 | 6668 |
6662 bool first_allocation = !function->has_initial_map(); | 6669 bool first_allocation = !function->has_initial_map(); |
6663 Handle<JSObject> result = Factory::NewJSObject(function); | 6670 Handle<JSObject> result = Factory::NewJSObject(function); |
6664 if (first_allocation) { | 6671 if (first_allocation) { |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6721 | 6728 |
6722 static Object* Runtime_NewContext(Arguments args) { | 6729 static Object* Runtime_NewContext(Arguments args) { |
6723 NoHandleAllocation ha; | 6730 NoHandleAllocation ha; |
6724 ASSERT(args.length() == 1); | 6731 ASSERT(args.length() == 1); |
6725 | 6732 |
6726 CONVERT_CHECKED(JSFunction, function, args[0]); | 6733 CONVERT_CHECKED(JSFunction, function, args[0]); |
6727 int length = ScopeInfo<>::NumberOfContextSlots(function->code()); | 6734 int length = ScopeInfo<>::NumberOfContextSlots(function->code()); |
6728 Object* result = HEAP->AllocateFunctionContext(length, function); | 6735 Object* result = HEAP->AllocateFunctionContext(length, function); |
6729 if (result->IsFailure()) return result; | 6736 if (result->IsFailure()) return result; |
6730 | 6737 |
6731 Top::set_context(Context::cast(result)); | 6738 Isolate::Current()->set_context(Context::cast(result)); |
6732 | 6739 |
6733 return result; // non-failure | 6740 return result; // non-failure |
6734 } | 6741 } |
6735 | 6742 |
6736 static Object* PushContextHelper(Object* object, bool is_catch_context) { | 6743 static Object* PushContextHelper(Object* object, bool is_catch_context) { |
6737 // Convert the object to a proper JavaScript object. | 6744 // Convert the object to a proper JavaScript object. |
6738 Object* js_object = object; | 6745 Object* js_object = object; |
6739 if (!js_object->IsJSObject()) { | 6746 if (!js_object->IsJSObject()) { |
6740 js_object = js_object->ToObject(); | 6747 js_object = js_object->ToObject(); |
6741 if (js_object->IsFailure()) { | 6748 if (js_object->IsFailure()) { |
6742 if (!Failure::cast(js_object)->IsInternalError()) return js_object; | 6749 if (!Failure::cast(js_object)->IsInternalError()) return js_object; |
6743 HandleScope scope; | 6750 HandleScope scope; |
6744 Handle<Object> handle(object); | 6751 Handle<Object> handle(object); |
6745 Handle<Object> result = | 6752 Handle<Object> result = |
6746 Factory::NewTypeError("with_expression", HandleVector(&handle, 1)); | 6753 Factory::NewTypeError("with_expression", HandleVector(&handle, 1)); |
6747 return Top::Throw(*result); | 6754 return Isolate::Current()->Throw(*result); |
6748 } | 6755 } |
6749 } | 6756 } |
6750 | 6757 |
6751 Object* result = | 6758 Object* result = |
6752 HEAP->AllocateWithContext(Top::context(), | 6759 HEAP->AllocateWithContext(Isolate::Current()->context(), |
6753 JSObject::cast(js_object), | 6760 JSObject::cast(js_object), |
6754 is_catch_context); | 6761 is_catch_context); |
6755 if (result->IsFailure()) return result; | 6762 if (result->IsFailure()) return result; |
6756 | 6763 |
6757 Context* context = Context::cast(result); | 6764 Context* context = Context::cast(result); |
6758 Top::set_context(context); | 6765 Isolate::Current()->set_context(context); |
6759 | 6766 |
6760 return result; | 6767 return result; |
6761 } | 6768 } |
6762 | 6769 |
6763 | 6770 |
6764 static Object* Runtime_PushContext(Arguments args) { | 6771 static Object* Runtime_PushContext(Arguments args) { |
6765 NoHandleAllocation ha; | 6772 NoHandleAllocation ha; |
6766 ASSERT(args.length() == 1); | 6773 ASSERT(args.length() == 1); |
6767 return PushContextHelper(args[0], false); | 6774 return PushContextHelper(args[0], false); |
6768 } | 6775 } |
(...skipping 18 matching lines...) Expand all Loading... |
6787 ContextLookupFlags flags = FOLLOW_CHAINS; | 6794 ContextLookupFlags flags = FOLLOW_CHAINS; |
6788 Handle<Object> holder = | 6795 Handle<Object> holder = |
6789 context->Lookup(name, flags, &index, &attributes); | 6796 context->Lookup(name, flags, &index, &attributes); |
6790 | 6797 |
6791 if (index < 0 && !holder.is_null()) { | 6798 if (index < 0 && !holder.is_null()) { |
6792 ASSERT(holder->IsJSObject()); | 6799 ASSERT(holder->IsJSObject()); |
6793 return *holder; | 6800 return *holder; |
6794 } | 6801 } |
6795 | 6802 |
6796 // No intermediate context found. Use global object by default. | 6803 // No intermediate context found. Use global object by default. |
6797 return Top::context()->global(); | 6804 return Isolate::Current()->context()->global(); |
6798 } | 6805 } |
6799 | 6806 |
6800 | 6807 |
6801 // A mechanism to return a pair of Object pointers in registers (if possible). | 6808 // A mechanism to return a pair of Object pointers in registers (if possible). |
6802 // How this is achieved is calling convention-dependent. | 6809 // How this is achieved is calling convention-dependent. |
6803 // All currently supported x86 compiles uses calling conventions that are cdecl | 6810 // All currently supported x86 compiles uses calling conventions that are cdecl |
6804 // variants where a 64-bit value is returned in two 32-bit registers | 6811 // variants where a 64-bit value is returned in two 32-bit registers |
6805 // (edx:eax on ia32, r1:r0 on ARM). | 6812 // (edx:eax on ia32, r1:r0 on ARM). |
6806 // In AMD-64 calling convention a struct of two pointers is returned in rdx:rax. | 6813 // In AMD-64 calling convention a struct of two pointers is returned in rdx:rax. |
6807 // In Win64 calling convention, a struct of two pointers is returned in memory, | 6814 // In Win64 calling convention, a struct of two pointers is returned in memory, |
(...skipping 21 matching lines...) Expand all Loading... |
6829 | 6836 |
6830 static inline Object* Unhole(Object* x, PropertyAttributes attributes) { | 6837 static inline Object* Unhole(Object* x, PropertyAttributes attributes) { |
6831 ASSERT(!x->IsTheHole() || (attributes & READ_ONLY) != 0); | 6838 ASSERT(!x->IsTheHole() || (attributes & READ_ONLY) != 0); |
6832 USE(attributes); | 6839 USE(attributes); |
6833 return x->IsTheHole() ? HEAP->undefined_value() : x; | 6840 return x->IsTheHole() ? HEAP->undefined_value() : x; |
6834 } | 6841 } |
6835 | 6842 |
6836 | 6843 |
6837 static JSObject* ComputeReceiverForNonGlobal(JSObject* holder) { | 6844 static JSObject* ComputeReceiverForNonGlobal(JSObject* holder) { |
6838 ASSERT(!holder->IsGlobalObject()); | 6845 ASSERT(!holder->IsGlobalObject()); |
6839 Context* top = Top::context(); | 6846 Context* top = Isolate::Current()->context(); |
6840 // Get the context extension function. | 6847 // Get the context extension function. |
6841 JSFunction* context_extension_function = | 6848 JSFunction* context_extension_function = |
6842 top->global_context()->context_extension_function(); | 6849 top->global_context()->context_extension_function(); |
6843 // If the holder isn't a context extension object, we just return it | 6850 // If the holder isn't a context extension object, we just return it |
6844 // as the receiver. This allows arguments objects to be used as | 6851 // as the receiver. This allows arguments objects to be used as |
6845 // receivers, but only if they are put in the context scope chain | 6852 // receivers, but only if they are put in the context scope chain |
6846 // explicitly via a with-statement. | 6853 // explicitly via a with-statement. |
6847 Object* constructor = holder->map()->constructor(); | 6854 Object* constructor = holder->map()->constructor(); |
6848 if (constructor != context_extension_function) return holder; | 6855 if (constructor != context_extension_function) return holder; |
6849 // Fall back to using the global object as the receiver if the | 6856 // Fall back to using the global object as the receiver if the |
6850 // property turns out to be a local variable allocated in a context | 6857 // property turns out to be a local variable allocated in a context |
6851 // extension object - introduced via eval. | 6858 // extension object - introduced via eval. |
6852 return top->global()->global_receiver(); | 6859 return top->global()->global_receiver(); |
6853 } | 6860 } |
6854 | 6861 |
6855 | 6862 |
6856 static ObjectPair LoadContextSlotHelper(Arguments args, bool throw_error) { | 6863 static ObjectPair LoadContextSlotHelper(Arguments args, bool throw_error) { |
6857 HandleScope scope; | 6864 HandleScope scope; |
6858 ASSERT_EQ(2, args.length()); | 6865 ASSERT_EQ(2, args.length()); |
6859 | 6866 |
6860 if (!args[0]->IsContext() || !args[1]->IsString()) { | 6867 if (!args[0]->IsContext() || !args[1]->IsString()) { |
6861 return MakePair(Top::ThrowIllegalOperation(), NULL); | 6868 return MakePair(Isolate::Current()->ThrowIllegalOperation(), NULL); |
6862 } | 6869 } |
6863 Handle<Context> context = args.at<Context>(0); | 6870 Handle<Context> context = args.at<Context>(0); |
6864 Handle<String> name = args.at<String>(1); | 6871 Handle<String> name = args.at<String>(1); |
6865 | 6872 |
6866 int index; | 6873 int index; |
6867 PropertyAttributes attributes; | 6874 PropertyAttributes attributes; |
6868 ContextLookupFlags flags = FOLLOW_CHAINS; | 6875 ContextLookupFlags flags = FOLLOW_CHAINS; |
6869 Handle<Object> holder = | 6876 Handle<Object> holder = |
6870 context->Lookup(name, flags, &index, &attributes); | 6877 context->Lookup(name, flags, &index, &attributes); |
6871 | 6878 |
6872 // If the index is non-negative, the slot has been found in a local | 6879 // If the index is non-negative, the slot has been found in a local |
6873 // variable or a parameter. Read it from the context object or the | 6880 // variable or a parameter. Read it from the context object or the |
6874 // arguments object. | 6881 // arguments object. |
6875 if (index >= 0) { | 6882 if (index >= 0) { |
6876 // If the "property" we were looking for is a local variable or an | 6883 // If the "property" we were looking for is a local variable or an |
6877 // argument in a context, the receiver is the global object; see | 6884 // argument in a context, the receiver is the global object; see |
6878 // ECMA-262, 3rd., 10.1.6 and 10.2.3. | 6885 // ECMA-262, 3rd., 10.1.6 and 10.2.3. |
6879 JSObject* receiver = Top::context()->global()->global_receiver(); | 6886 JSObject* receiver = |
| 6887 Isolate::Current()->context()->global()->global_receiver(); |
6880 Object* value = (holder->IsContext()) | 6888 Object* value = (holder->IsContext()) |
6881 ? Context::cast(*holder)->get(index) | 6889 ? Context::cast(*holder)->get(index) |
6882 : JSObject::cast(*holder)->GetElement(index); | 6890 : JSObject::cast(*holder)->GetElement(index); |
6883 return MakePair(Unhole(value, attributes), receiver); | 6891 return MakePair(Unhole(value, attributes), receiver); |
6884 } | 6892 } |
6885 | 6893 |
6886 // If the holder is found, we read the property from it. | 6894 // If the holder is found, we read the property from it. |
6887 if (!holder.is_null() && holder->IsJSObject()) { | 6895 if (!holder.is_null() && holder->IsJSObject()) { |
6888 ASSERT(Handle<JSObject>::cast(holder)->HasProperty(*name)); | 6896 ASSERT(Handle<JSObject>::cast(holder)->HasProperty(*name)); |
6889 JSObject* object = JSObject::cast(*holder); | 6897 JSObject* object = JSObject::cast(*holder); |
6890 JSObject* receiver; | 6898 JSObject* receiver; |
6891 if (object->IsGlobalObject()) { | 6899 if (object->IsGlobalObject()) { |
6892 receiver = GlobalObject::cast(object)->global_receiver(); | 6900 receiver = GlobalObject::cast(object)->global_receiver(); |
6893 } else if (context->is_exception_holder(*holder)) { | 6901 } else if (context->is_exception_holder(*holder)) { |
6894 receiver = Top::context()->global()->global_receiver(); | 6902 receiver = Isolate::Current()->context()->global()->global_receiver(); |
6895 } else { | 6903 } else { |
6896 receiver = ComputeReceiverForNonGlobal(object); | 6904 receiver = ComputeReceiverForNonGlobal(object); |
6897 } | 6905 } |
6898 // No need to unhole the value here. This is taken care of by the | 6906 // No need to unhole the value here. This is taken care of by the |
6899 // GetProperty function. | 6907 // GetProperty function. |
6900 Object* value = object->GetProperty(*name); | 6908 Object* value = object->GetProperty(*name); |
6901 return MakePair(value, receiver); | 6909 return MakePair(value, receiver); |
6902 } | 6910 } |
6903 | 6911 |
6904 if (throw_error) { | 6912 if (throw_error) { |
6905 // The property doesn't exist - throw exception. | 6913 // The property doesn't exist - throw exception. |
6906 Handle<Object> reference_error = | 6914 Handle<Object> reference_error = |
6907 Factory::NewReferenceError("not_defined", HandleVector(&name, 1)); | 6915 Factory::NewReferenceError("not_defined", HandleVector(&name, 1)); |
6908 return MakePair(Top::Throw(*reference_error), NULL); | 6916 return MakePair(Isolate::Current()->Throw(*reference_error), NULL); |
6909 } else { | 6917 } else { |
6910 // The property doesn't exist - return undefined | 6918 // The property doesn't exist - return undefined |
6911 return MakePair(HEAP->undefined_value(), HEAP->undefined_value()); | 6919 return MakePair(HEAP->undefined_value(), HEAP->undefined_value()); |
6912 } | 6920 } |
6913 } | 6921 } |
6914 | 6922 |
6915 | 6923 |
6916 static ObjectPair Runtime_LoadContextSlot(Arguments args) { | 6924 static ObjectPair Runtime_LoadContextSlot(Arguments args) { |
6917 return LoadContextSlotHelper(args, true); | 6925 return LoadContextSlotHelper(args, true); |
6918 } | 6926 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6957 // It is either in an JSObject extension context or it was not found. | 6965 // It is either in an JSObject extension context or it was not found. |
6958 Handle<JSObject> context_ext; | 6966 Handle<JSObject> context_ext; |
6959 | 6967 |
6960 if (!holder.is_null()) { | 6968 if (!holder.is_null()) { |
6961 // The property exists in the extension context. | 6969 // The property exists in the extension context. |
6962 context_ext = Handle<JSObject>::cast(holder); | 6970 context_ext = Handle<JSObject>::cast(holder); |
6963 } else { | 6971 } else { |
6964 // The property was not found. It needs to be stored in the global context. | 6972 // The property was not found. It needs to be stored in the global context. |
6965 ASSERT(attributes == ABSENT); | 6973 ASSERT(attributes == ABSENT); |
6966 attributes = NONE; | 6974 attributes = NONE; |
6967 context_ext = Handle<JSObject>(Top::context()->global()); | 6975 context_ext = Handle<JSObject>(Isolate::Current()->context()->global()); |
6968 } | 6976 } |
6969 | 6977 |
6970 // Set the property, but ignore if read_only variable on the context | 6978 // Set the property, but ignore if read_only variable on the context |
6971 // extension object itself. | 6979 // extension object itself. |
6972 if ((attributes & READ_ONLY) == 0 || | 6980 if ((attributes & READ_ONLY) == 0 || |
6973 (context_ext->GetLocalPropertyAttribute(*name) == ABSENT)) { | 6981 (context_ext->GetLocalPropertyAttribute(*name) == ABSENT)) { |
6974 Handle<Object> set = SetProperty(context_ext, name, value, attributes); | 6982 Handle<Object> set = SetProperty(context_ext, name, value, attributes); |
6975 if (set.is_null()) { | 6983 if (set.is_null()) { |
6976 // Failure::Exception is converted to a null handle in the | 6984 // Failure::Exception is converted to a null handle in the |
6977 // handle-based methods such as SetProperty. We therefore need | 6985 // handle-based methods such as SetProperty. We therefore need |
6978 // to convert null handles back to exceptions. | 6986 // to convert null handles back to exceptions. |
6979 ASSERT(Top::has_pending_exception()); | 6987 ASSERT(Isolate::Current()->has_pending_exception()); |
6980 return Failure::Exception(); | 6988 return Failure::Exception(); |
6981 } | 6989 } |
6982 } | 6990 } |
6983 return *value; | 6991 return *value; |
6984 } | 6992 } |
6985 | 6993 |
6986 | 6994 |
6987 static Object* Runtime_Throw(Arguments args) { | 6995 static Object* Runtime_Throw(Arguments args) { |
6988 HandleScope scope; | 6996 HandleScope scope; |
6989 ASSERT(args.length() == 1); | 6997 ASSERT(args.length() == 1); |
6990 | 6998 |
6991 return Top::Throw(args[0]); | 6999 return Isolate::Current()->Throw(args[0]); |
6992 } | 7000 } |
6993 | 7001 |
6994 | 7002 |
6995 static Object* Runtime_ReThrow(Arguments args) { | 7003 static Object* Runtime_ReThrow(Arguments args) { |
6996 HandleScope scope; | 7004 HandleScope scope; |
6997 ASSERT(args.length() == 1); | 7005 ASSERT(args.length() == 1); |
6998 | 7006 |
6999 return Top::ReThrow(args[0]); | 7007 return Isolate::Current()->ReThrow(args[0]); |
7000 } | 7008 } |
7001 | 7009 |
7002 | 7010 |
7003 static Object* Runtime_PromoteScheduledException(Arguments args) { | 7011 static Object* Runtime_PromoteScheduledException(Arguments args) { |
7004 ASSERT_EQ(0, args.length()); | 7012 ASSERT_EQ(0, args.length()); |
7005 return Top::PromoteScheduledException(); | 7013 return Isolate::Current()->PromoteScheduledException(); |
7006 } | 7014 } |
7007 | 7015 |
7008 | 7016 |
7009 static Object* Runtime_ThrowReferenceError(Arguments args) { | 7017 static Object* Runtime_ThrowReferenceError(Arguments args) { |
7010 HandleScope scope; | 7018 HandleScope scope; |
7011 ASSERT(args.length() == 1); | 7019 ASSERT(args.length() == 1); |
7012 | 7020 |
7013 Handle<Object> name(args[0]); | 7021 Handle<Object> name(args[0]); |
7014 Handle<Object> reference_error = | 7022 Handle<Object> reference_error = |
7015 Factory::NewReferenceError("not_defined", HandleVector(&name, 1)); | 7023 Factory::NewReferenceError("not_defined", HandleVector(&name, 1)); |
7016 return Top::Throw(*reference_error); | 7024 return Isolate::Current()->Throw(*reference_error); |
7017 } | 7025 } |
7018 | 7026 |
7019 | 7027 |
7020 static Object* Runtime_StackOverflow(Arguments args) { | 7028 static Object* Runtime_StackOverflow(Arguments args) { |
7021 NoHandleAllocation na; | 7029 NoHandleAllocation na; |
7022 return Top::StackOverflow(); | 7030 return Isolate::Current()->StackOverflow(); |
7023 } | 7031 } |
7024 | 7032 |
7025 | 7033 |
7026 static Object* Runtime_StackGuard(Arguments args) { | 7034 static Object* Runtime_StackGuard(Arguments args) { |
7027 ASSERT(args.length() == 1); | 7035 ASSERT(args.length() == 1); |
7028 Isolate* isolate = Isolate::Current(); | 7036 Isolate* isolate = Isolate::Current(); |
7029 // First check if this is a real stack overflow. | 7037 // First check if this is a real stack overflow. |
7030 if (isolate->stack_guard()->IsStackOverflow()) { | 7038 if (isolate->stack_guard()->IsStackOverflow()) { |
7031 return Runtime_StackOverflow(args); | 7039 return Runtime_StackOverflow(args); |
7032 } | 7040 } |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7163 PrintF("\n"); | 7171 PrintF("\n"); |
7164 Flush(); | 7172 Flush(); |
7165 | 7173 |
7166 return args[0]; // return TOS | 7174 return args[0]; // return TOS |
7167 } | 7175 } |
7168 | 7176 |
7169 | 7177 |
7170 static Object* Runtime_DebugTrace(Arguments args) { | 7178 static Object* Runtime_DebugTrace(Arguments args) { |
7171 ASSERT(args.length() == 0); | 7179 ASSERT(args.length() == 0); |
7172 NoHandleAllocation ha; | 7180 NoHandleAllocation ha; |
7173 Top::PrintStack(); | 7181 Isolate::Current()->PrintStack(); |
7174 return HEAP->undefined_value(); | 7182 return HEAP->undefined_value(); |
7175 } | 7183 } |
7176 | 7184 |
7177 | 7185 |
7178 static Object* Runtime_DateCurrentTime(Arguments args) { | 7186 static Object* Runtime_DateCurrentTime(Arguments args) { |
7179 NoHandleAllocation ha; | 7187 NoHandleAllocation ha; |
7180 ASSERT(args.length() == 0); | 7188 ASSERT(args.length() == 0); |
7181 | 7189 |
7182 // According to ECMA-262, section 15.9.1, page 117, the precision of | 7190 // According to ECMA-262, section 15.9.1, page 117, the precision of |
7183 // the number in a Date object representing a particular instant in | 7191 // the number in a Date object representing a particular instant in |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7253 } | 7261 } |
7254 | 7262 |
7255 | 7263 |
7256 static Object* Runtime_CompileString(Arguments args) { | 7264 static Object* Runtime_CompileString(Arguments args) { |
7257 HandleScope scope; | 7265 HandleScope scope; |
7258 ASSERT_EQ(2, args.length()); | 7266 ASSERT_EQ(2, args.length()); |
7259 CONVERT_ARG_CHECKED(String, source, 0); | 7267 CONVERT_ARG_CHECKED(String, source, 0); |
7260 CONVERT_ARG_CHECKED(Oddball, is_json, 1) | 7268 CONVERT_ARG_CHECKED(Oddball, is_json, 1) |
7261 | 7269 |
7262 // Compile source string in the global context. | 7270 // Compile source string in the global context. |
7263 Handle<Context> context(Top::context()->global_context()); | 7271 Handle<Context> context(Isolate::Current()->context()->global_context()); |
7264 Compiler::ValidationState validate = (is_json->IsTrue()) | 7272 Compiler::ValidationState validate = (is_json->IsTrue()) |
7265 ? Compiler::VALIDATE_JSON : Compiler::DONT_VALIDATE_JSON; | 7273 ? Compiler::VALIDATE_JSON : Compiler::DONT_VALIDATE_JSON; |
7266 Handle<SharedFunctionInfo> shared = Compiler::CompileEval(source, | 7274 Handle<SharedFunctionInfo> shared = Compiler::CompileEval(source, |
7267 context, | 7275 context, |
7268 true, | 7276 true, |
7269 validate); | 7277 validate); |
7270 if (shared.is_null()) return Failure::Exception(); | 7278 if (shared.is_null()) return Failure::Exception(); |
7271 Handle<JSFunction> fun = | 7279 Handle<JSFunction> fun = |
7272 Factory::NewFunctionFromSharedFunctionInfo(shared, context, NOT_TENURED); | 7280 Factory::NewFunctionFromSharedFunctionInfo(shared, context, NOT_TENURED); |
7273 return *fun; | 7281 return *fun; |
7274 } | 7282 } |
7275 | 7283 |
7276 | 7284 |
7277 static ObjectPair CompileGlobalEval(Handle<String> source, | 7285 static ObjectPair CompileGlobalEval(Handle<String> source, |
7278 Handle<Object> receiver) { | 7286 Handle<Object> receiver) { |
7279 // Deal with a normal eval call with a string argument. Compile it | 7287 // Deal with a normal eval call with a string argument. Compile it |
7280 // and return the compiled function bound in the local context. | 7288 // and return the compiled function bound in the local context. |
7281 Handle<SharedFunctionInfo> shared = Compiler::CompileEval( | 7289 Handle<SharedFunctionInfo> shared = Compiler::CompileEval( |
7282 source, | 7290 source, |
7283 Handle<Context>(Top::context()), | 7291 Handle<Context>(Isolate::Current()->context()), |
7284 Top::context()->IsGlobalContext(), | 7292 Isolate::Current()->context()->IsGlobalContext(), |
7285 Compiler::DONT_VALIDATE_JSON); | 7293 Compiler::DONT_VALIDATE_JSON); |
7286 if (shared.is_null()) return MakePair(Failure::Exception(), NULL); | 7294 if (shared.is_null()) return MakePair(Failure::Exception(), NULL); |
7287 Handle<JSFunction> compiled = Factory::NewFunctionFromSharedFunctionInfo( | 7295 Handle<JSFunction> compiled = Factory::NewFunctionFromSharedFunctionInfo( |
7288 shared, | 7296 shared, |
7289 Handle<Context>(Top::context()), | 7297 Handle<Context>(Isolate::Current()->context()), |
7290 NOT_TENURED); | 7298 NOT_TENURED); |
7291 return MakePair(*compiled, *receiver); | 7299 return MakePair(*compiled, *receiver); |
7292 } | 7300 } |
7293 | 7301 |
7294 | 7302 |
7295 static ObjectPair Runtime_ResolvePossiblyDirectEval(Arguments args) { | 7303 static ObjectPair Runtime_ResolvePossiblyDirectEval(Arguments args) { |
7296 ASSERT(args.length() == 3); | 7304 ASSERT(args.length() == 3); |
7297 if (!args[0]->IsJSFunction()) { | 7305 if (!args[0]->IsJSFunction()) { |
7298 return MakePair(Top::ThrowIllegalOperation(), NULL); | 7306 return MakePair(Isolate::Current()->ThrowIllegalOperation(), NULL); |
7299 } | 7307 } |
7300 | 7308 |
7301 HandleScope scope; | 7309 HandleScope scope; |
7302 Handle<JSFunction> callee = args.at<JSFunction>(0); | 7310 Handle<JSFunction> callee = args.at<JSFunction>(0); |
7303 Handle<Object> receiver; // Will be overwritten. | 7311 Handle<Object> receiver; // Will be overwritten. |
7304 | 7312 |
7305 // Compute the calling context. | 7313 // Compute the calling context. |
7306 Handle<Context> context = Handle<Context>(Top::context()); | 7314 Handle<Context> context = Handle<Context>(Isolate::Current()->context()); |
7307 #ifdef DEBUG | 7315 #ifdef DEBUG |
7308 // Make sure Top::context() agrees with the old code that traversed | 7316 // Make sure Isolate::context() agrees with the old code that traversed |
7309 // the stack frames to compute the context. | 7317 // the stack frames to compute the context. |
7310 StackFrameLocator locator; | 7318 StackFrameLocator locator; |
7311 JavaScriptFrame* frame = locator.FindJavaScriptFrame(0); | 7319 JavaScriptFrame* frame = locator.FindJavaScriptFrame(0); |
7312 ASSERT(Context::cast(frame->context()) == *context); | 7320 ASSERT(Context::cast(frame->context()) == *context); |
7313 #endif | 7321 #endif |
7314 | 7322 |
7315 // Find where the 'eval' symbol is bound. It is unaliased only if | 7323 // Find where the 'eval' symbol is bound. It is unaliased only if |
7316 // it is bound in the global context. | 7324 // it is bound in the global context. |
7317 int index = -1; | 7325 int index = -1; |
7318 PropertyAttributes attributes = ABSENT; | 7326 PropertyAttributes attributes = ABSENT; |
7319 while (true) { | 7327 while (true) { |
7320 receiver = context->Lookup(Factory::eval_symbol(), FOLLOW_PROTOTYPE_CHAIN, | 7328 receiver = context->Lookup(Factory::eval_symbol(), FOLLOW_PROTOTYPE_CHAIN, |
7321 &index, &attributes); | 7329 &index, &attributes); |
7322 // Stop search when eval is found or when the global context is | 7330 // Stop search when eval is found or when the global context is |
7323 // reached. | 7331 // reached. |
7324 if (attributes != ABSENT || context->IsGlobalContext()) break; | 7332 if (attributes != ABSENT || context->IsGlobalContext()) break; |
7325 if (context->is_function_context()) { | 7333 if (context->is_function_context()) { |
7326 context = Handle<Context>(Context::cast(context->closure()->context())); | 7334 context = Handle<Context>(Context::cast(context->closure()->context())); |
7327 } else { | 7335 } else { |
7328 context = Handle<Context>(context->previous()); | 7336 context = Handle<Context>(context->previous()); |
7329 } | 7337 } |
7330 } | 7338 } |
7331 | 7339 |
7332 // If eval could not be resolved, it has been deleted and we need to | 7340 // If eval could not be resolved, it has been deleted and we need to |
7333 // throw a reference error. | 7341 // throw a reference error. |
7334 if (attributes == ABSENT) { | 7342 if (attributes == ABSENT) { |
7335 Handle<Object> name = Factory::eval_symbol(); | 7343 Handle<Object> name = Factory::eval_symbol(); |
7336 Handle<Object> reference_error = | 7344 Handle<Object> reference_error = |
7337 Factory::NewReferenceError("not_defined", HandleVector(&name, 1)); | 7345 Factory::NewReferenceError("not_defined", HandleVector(&name, 1)); |
7338 return MakePair(Top::Throw(*reference_error), NULL); | 7346 return MakePair(Isolate::Current()->Throw(*reference_error), NULL); |
7339 } | 7347 } |
7340 | 7348 |
7341 if (!context->IsGlobalContext()) { | 7349 if (!context->IsGlobalContext()) { |
7342 // 'eval' is not bound in the global context. Just call the function | 7350 // 'eval' is not bound in the global context. Just call the function |
7343 // with the given arguments. This is not necessarily the global eval. | 7351 // with the given arguments. This is not necessarily the global eval. |
7344 if (receiver->IsContext()) { | 7352 if (receiver->IsContext()) { |
7345 context = Handle<Context>::cast(receiver); | 7353 context = Handle<Context>::cast(receiver); |
7346 receiver = Handle<Object>(context->get(index)); | 7354 receiver = Handle<Object>(context->get(index)); |
7347 } else if (receiver->IsJSContextExtensionObject()) { | 7355 } else if (receiver->IsJSContextExtensionObject()) { |
7348 receiver = Handle<JSObject>(Top::context()->global()->global_receiver()); | 7356 receiver = Handle<JSObject>( |
| 7357 Isolate::Current()->context()->global()->global_receiver()); |
7349 } | 7358 } |
7350 return MakePair(*callee, *receiver); | 7359 return MakePair(*callee, *receiver); |
7351 } | 7360 } |
7352 | 7361 |
7353 // 'eval' is bound in the global context, but it may have been overwritten. | 7362 // 'eval' is bound in the global context, but it may have been overwritten. |
7354 // Compare it to the builtin 'GlobalEval' function to make sure. | 7363 // Compare it to the builtin 'GlobalEval' function to make sure. |
7355 if (*callee != Top::global_context()->global_eval_fun() || | 7364 if (*callee != Isolate::Current()->global_context()->global_eval_fun() || |
7356 !args[1]->IsString()) { | 7365 !args[1]->IsString()) { |
7357 return MakePair(*callee, Top::context()->global()->global_receiver()); | 7366 return MakePair(*callee, |
| 7367 Isolate::Current()->context()->global()->global_receiver()); |
7358 } | 7368 } |
7359 | 7369 |
7360 return CompileGlobalEval(args.at<String>(1), args.at<Object>(2)); | 7370 return CompileGlobalEval(args.at<String>(1), args.at<Object>(2)); |
7361 } | 7371 } |
7362 | 7372 |
7363 | 7373 |
7364 static ObjectPair Runtime_ResolvePossiblyDirectEvalNoLookup(Arguments args) { | 7374 static ObjectPair Runtime_ResolvePossiblyDirectEvalNoLookup(Arguments args) { |
7365 ASSERT(args.length() == 3); | 7375 ASSERT(args.length() == 3); |
7366 if (!args[0]->IsJSFunction()) { | 7376 if (!args[0]->IsJSFunction()) { |
7367 return MakePair(Top::ThrowIllegalOperation(), NULL); | 7377 return MakePair(Isolate::Current()->ThrowIllegalOperation(), NULL); |
7368 } | 7378 } |
7369 | 7379 |
7370 HandleScope scope; | 7380 HandleScope scope; |
7371 Handle<JSFunction> callee = args.at<JSFunction>(0); | 7381 Handle<JSFunction> callee = args.at<JSFunction>(0); |
7372 | 7382 |
7373 // 'eval' is bound in the global context, but it may have been overwritten. | 7383 // 'eval' is bound in the global context, but it may have been overwritten. |
7374 // Compare it to the builtin 'GlobalEval' function to make sure. | 7384 // Compare it to the builtin 'GlobalEval' function to make sure. |
7375 if (*callee != Top::global_context()->global_eval_fun() || | 7385 if (*callee != Isolate::Current()->global_context()->global_eval_fun() || |
7376 !args[1]->IsString()) { | 7386 !args[1]->IsString()) { |
7377 return MakePair(*callee, Top::context()->global()->global_receiver()); | 7387 return MakePair(*callee, |
| 7388 Isolate::Current()->context()->global()->global_receiver()); |
7378 } | 7389 } |
7379 | 7390 |
7380 return CompileGlobalEval(args.at<String>(1), args.at<Object>(2)); | 7391 return CompileGlobalEval(args.at<String>(1), args.at<Object>(2)); |
7381 } | 7392 } |
7382 | 7393 |
7383 | 7394 |
7384 static Object* Runtime_SetNewFunctionAttributes(Arguments args) { | 7395 static Object* Runtime_SetNewFunctionAttributes(Arguments args) { |
7385 // This utility adjusts the property attributes for newly created Function | 7396 // This utility adjusts the property attributes for newly created Function |
7386 // object ("new Function(...)") by changing the map. | 7397 // object ("new Function(...)") by changing the map. |
7387 // All it does is changing the prototype property to enumerable | 7398 // All it does is changing the prototype property to enumerable |
7388 // as specified in ECMA262, 15.3.5.2. | 7399 // as specified in ECMA262, 15.3.5.2. |
7389 HandleScope scope; | 7400 HandleScope scope; |
7390 ASSERT(args.length() == 1); | 7401 ASSERT(args.length() == 1); |
7391 CONVERT_ARG_CHECKED(JSFunction, func, 0); | 7402 CONVERT_ARG_CHECKED(JSFunction, func, 0); |
7392 ASSERT(func->map()->instance_type() == | 7403 ASSERT(func->map()->instance_type() == |
7393 Top::function_instance_map()->instance_type()); | 7404 Isolate::Current()->function_instance_map()->instance_type()); |
7394 ASSERT(func->map()->instance_size() == | 7405 ASSERT(func->map()->instance_size() == |
7395 Top::function_instance_map()->instance_size()); | 7406 Isolate::Current()->function_instance_map()->instance_size()); |
7396 func->set_map(*Top::function_instance_map()); | 7407 func->set_map(*Isolate::Current()->function_instance_map()); |
7397 return *func; | 7408 return *func; |
7398 } | 7409 } |
7399 | 7410 |
7400 | 7411 |
7401 // Push an array unto an array of arrays if it is not already in the | 7412 // Push an array unto an array of arrays if it is not already in the |
7402 // array. Returns true if the element was pushed on the stack and | 7413 // array. Returns true if the element was pushed on the stack and |
7403 // false otherwise. | 7414 // false otherwise. |
7404 static Object* Runtime_PushIfAbsent(Arguments args) { | 7415 static Object* Runtime_PushIfAbsent(Arguments args) { |
7405 ASSERT(args.length() == 2); | 7416 ASSERT(args.length() == 2); |
7406 CONVERT_CHECKED(JSArray, array, args[0]); | 7417 CONVERT_CHECKED(JSArray, array, args[0]); |
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7869 | 7880 |
7870 ASSERT_EQ(3, args.length()); | 7881 ASSERT_EQ(3, args.length()); |
7871 | 7882 |
7872 CONVERT_ARG_CHECKED(JSObject, object, 0); | 7883 CONVERT_ARG_CHECKED(JSObject, object, 0); |
7873 Handle<Object> key1 = args.at<Object>(1); | 7884 Handle<Object> key1 = args.at<Object>(1); |
7874 Handle<Object> key2 = args.at<Object>(2); | 7885 Handle<Object> key2 = args.at<Object>(2); |
7875 | 7886 |
7876 uint32_t index1, index2; | 7887 uint32_t index1, index2; |
7877 if (!key1->ToArrayIndex(&index1) | 7888 if (!key1->ToArrayIndex(&index1) |
7878 || !key2->ToArrayIndex(&index2)) { | 7889 || !key2->ToArrayIndex(&index2)) { |
7879 return Top::ThrowIllegalOperation(); | 7890 return Isolate::Current()->ThrowIllegalOperation(); |
7880 } | 7891 } |
7881 | 7892 |
7882 Handle<JSObject> jsobject = Handle<JSObject>::cast(object); | 7893 Handle<JSObject> jsobject = Handle<JSObject>::cast(object); |
7883 Handle<Object> tmp1 = GetElement(jsobject, index1); | 7894 Handle<Object> tmp1 = GetElement(jsobject, index1); |
7884 Handle<Object> tmp2 = GetElement(jsobject, index2); | 7895 Handle<Object> tmp2 = GetElement(jsobject, index2); |
7885 | 7896 |
7886 SetElement(jsobject, index1, tmp2); | 7897 SetElement(jsobject, index1, tmp2); |
7887 SetElement(jsobject, index2, tmp1); | 7898 SetElement(jsobject, index2, tmp1); |
7888 | 7899 |
7889 return HEAP->undefined_value(); | 7900 return HEAP->undefined_value(); |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8026 } | 8037 } |
8027 return value; | 8038 return value; |
8028 case CONSTANT_FUNCTION: | 8039 case CONSTANT_FUNCTION: |
8029 return result->GetConstantFunction(); | 8040 return result->GetConstantFunction(); |
8030 case CALLBACKS: { | 8041 case CALLBACKS: { |
8031 Object* structure = result->GetCallbackObject(); | 8042 Object* structure = result->GetCallbackObject(); |
8032 if (structure->IsProxy() || structure->IsAccessorInfo()) { | 8043 if (structure->IsProxy() || structure->IsAccessorInfo()) { |
8033 value = receiver->GetPropertyWithCallback( | 8044 value = receiver->GetPropertyWithCallback( |
8034 receiver, structure, name, result->holder()); | 8045 receiver, structure, name, result->holder()); |
8035 if (value->IsException()) { | 8046 if (value->IsException()) { |
8036 value = Top::pending_exception(); | 8047 value = Isolate::Current()->pending_exception(); |
8037 Top::clear_pending_exception(); | 8048 Isolate::Current()->clear_pending_exception(); |
8038 if (caught_exception != NULL) { | 8049 if (caught_exception != NULL) { |
8039 *caught_exception = true; | 8050 *caught_exception = true; |
8040 } | 8051 } |
8041 } | 8052 } |
8042 return value; | 8053 return value; |
8043 } else { | 8054 } else { |
8044 return HEAP->undefined_value(); | 8055 return HEAP->undefined_value(); |
8045 } | 8056 } |
8046 } | 8057 } |
8047 case INTERCEPTOR: | 8058 case INTERCEPTOR: |
(...skipping 30 matching lines...) Expand all Loading... |
8078 CONVERT_ARG_CHECKED(String, name, 1); | 8089 CONVERT_ARG_CHECKED(String, name, 1); |
8079 | 8090 |
8080 // Make sure to set the current context to the context before the debugger was | 8091 // Make sure to set the current context to the context before the debugger was |
8081 // entered (if the debugger is entered). The reason for switching context here | 8092 // entered (if the debugger is entered). The reason for switching context here |
8082 // is that for some property lookups (accessors and interceptors) callbacks | 8093 // is that for some property lookups (accessors and interceptors) callbacks |
8083 // into the embedding application can occour, and the embedding application | 8094 // into the embedding application can occour, and the embedding application |
8084 // could have the assumption that its own global context is the current | 8095 // could have the assumption that its own global context is the current |
8085 // context and not some internal debugger context. | 8096 // context and not some internal debugger context. |
8086 SaveContext save; | 8097 SaveContext save; |
8087 if (Debug::InDebugger()) { | 8098 if (Debug::InDebugger()) { |
8088 Top::set_context(*Debug::debugger_entry()->GetContext()); | 8099 Isolate::Current()->set_context(*Debug::debugger_entry()->GetContext()); |
8089 } | 8100 } |
8090 | 8101 |
8091 // Skip the global proxy as it has no properties and always delegates to the | 8102 // Skip the global proxy as it has no properties and always delegates to the |
8092 // real global object. | 8103 // real global object. |
8093 if (obj->IsJSGlobalProxy()) { | 8104 if (obj->IsJSGlobalProxy()) { |
8094 obj = Handle<JSObject>(JSObject::cast(obj->GetPrototype())); | 8105 obj = Handle<JSObject>(JSObject::cast(obj->GetPrototype())); |
8095 } | 8106 } |
8096 | 8107 |
8097 | 8108 |
8098 // Check if the name is trivially convertible to an index and get the element | 8109 // Check if the name is trivially convertible to an index and get the element |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8232 | 8243 |
8233 return obj->GetElementWithInterceptor(*obj, index); | 8244 return obj->GetElementWithInterceptor(*obj, index); |
8234 } | 8245 } |
8235 | 8246 |
8236 | 8247 |
8237 static Object* Runtime_CheckExecutionState(Arguments args) { | 8248 static Object* Runtime_CheckExecutionState(Arguments args) { |
8238 ASSERT(args.length() >= 1); | 8249 ASSERT(args.length() >= 1); |
8239 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); | 8250 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); |
8240 // Check that the break id is valid. | 8251 // Check that the break id is valid. |
8241 if (Debug::break_id() == 0 || break_id != Debug::break_id()) { | 8252 if (Debug::break_id() == 0 || break_id != Debug::break_id()) { |
8242 return Top::Throw(HEAP->illegal_execution_state_symbol()); | 8253 return Isolate::Current()->Throw(HEAP->illegal_execution_state_symbol()); |
8243 } | 8254 } |
8244 | 8255 |
8245 return HEAP->true_value(); | 8256 return HEAP->true_value(); |
8246 } | 8257 } |
8247 | 8258 |
8248 | 8259 |
8249 static Object* Runtime_GetFrameCount(Arguments args) { | 8260 static Object* Runtime_GetFrameCount(Arguments args) { |
8250 HandleScope scope; | 8261 HandleScope scope; |
8251 ASSERT(args.length() == 1); | 8262 ASSERT(args.length() == 1); |
8252 | 8263 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8312 int count = 0; | 8323 int count = 0; |
8313 JavaScriptFrameIterator it(id); | 8324 JavaScriptFrameIterator it(id); |
8314 for (; !it.done(); it.Advance()) { | 8325 for (; !it.done(); it.Advance()) { |
8315 if (count == index) break; | 8326 if (count == index) break; |
8316 count++; | 8327 count++; |
8317 } | 8328 } |
8318 if (it.done()) return HEAP->undefined_value(); | 8329 if (it.done()) return HEAP->undefined_value(); |
8319 | 8330 |
8320 // Traverse the saved contexts chain to find the active context for the | 8331 // Traverse the saved contexts chain to find the active context for the |
8321 // selected frame. | 8332 // selected frame. |
8322 SaveContext* save = Top::save_context(); | 8333 SaveContext* save = Isolate::Current()->save_context(); |
8323 while (save != NULL && !save->below(it.frame())) { | 8334 while (save != NULL && !save->below(it.frame())) { |
8324 save = save->prev(); | 8335 save = save->prev(); |
8325 } | 8336 } |
8326 ASSERT(save != NULL); | 8337 ASSERT(save != NULL); |
8327 | 8338 |
8328 // Get the frame id. | 8339 // Get the frame id. |
8329 Handle<Object> frame_id(WrapFrameId(it.frame()->id())); | 8340 Handle<Object> frame_id(WrapFrameId(it.frame()->id())); |
8330 | 8341 |
8331 // Find source position. | 8342 // Find source position. |
8332 int position = it.frame()->code()->SourcePosition(it.frame()->pc()); | 8343 int position = it.frame()->code()->SourcePosition(it.frame()->pc()); |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8530 | 8541 |
8531 // Create a plain JSObject which materializes the local scope for the specified | 8542 // Create a plain JSObject which materializes the local scope for the specified |
8532 // frame. | 8543 // frame. |
8533 static Handle<JSObject> MaterializeLocalScope(JavaScriptFrame* frame) { | 8544 static Handle<JSObject> MaterializeLocalScope(JavaScriptFrame* frame) { |
8534 Handle<JSFunction> function(JSFunction::cast(frame->function())); | 8545 Handle<JSFunction> function(JSFunction::cast(frame->function())); |
8535 Handle<Code> code(function->code()); | 8546 Handle<Code> code(function->code()); |
8536 ScopeInfo<> scope_info(*code); | 8547 ScopeInfo<> scope_info(*code); |
8537 | 8548 |
8538 // Allocate and initialize a JSObject with all the arguments, stack locals | 8549 // Allocate and initialize a JSObject with all the arguments, stack locals |
8539 // heap locals and extension properties of the debugged function. | 8550 // heap locals and extension properties of the debugged function. |
8540 Handle<JSObject> local_scope = Factory::NewJSObject(Top::object_function()); | 8551 Handle<JSObject> local_scope = |
| 8552 Factory::NewJSObject(Isolate::Current()->object_function()); |
8541 | 8553 |
8542 // First fill all parameters. | 8554 // First fill all parameters. |
8543 for (int i = 0; i < scope_info.number_of_parameters(); ++i) { | 8555 for (int i = 0; i < scope_info.number_of_parameters(); ++i) { |
8544 SetProperty(local_scope, | 8556 SetProperty(local_scope, |
8545 scope_info.parameter_name(i), | 8557 scope_info.parameter_name(i), |
8546 Handle<Object>(frame->GetParameter(i)), NONE); | 8558 Handle<Object>(frame->GetParameter(i)), NONE); |
8547 } | 8559 } |
8548 | 8560 |
8549 // Second fill all stack locals. | 8561 // Second fill all stack locals. |
8550 for (int i = 0; i < scope_info.number_of_stack_slots(); i++) { | 8562 for (int i = 0; i < scope_info.number_of_stack_slots(); i++) { |
(...skipping 30 matching lines...) Expand all Loading... |
8581 // Create a plain JSObject which materializes the closure content for the | 8593 // Create a plain JSObject which materializes the closure content for the |
8582 // context. | 8594 // context. |
8583 static Handle<JSObject> MaterializeClosure(Handle<Context> context) { | 8595 static Handle<JSObject> MaterializeClosure(Handle<Context> context) { |
8584 ASSERT(context->is_function_context()); | 8596 ASSERT(context->is_function_context()); |
8585 | 8597 |
8586 Handle<Code> code(context->closure()->code()); | 8598 Handle<Code> code(context->closure()->code()); |
8587 ScopeInfo<> scope_info(*code); | 8599 ScopeInfo<> scope_info(*code); |
8588 | 8600 |
8589 // Allocate and initialize a JSObject with all the content of theis function | 8601 // Allocate and initialize a JSObject with all the content of theis function |
8590 // closure. | 8602 // closure. |
8591 Handle<JSObject> closure_scope = Factory::NewJSObject(Top::object_function()); | 8603 Handle<JSObject> closure_scope = |
| 8604 Factory::NewJSObject(Isolate::Current()->object_function()); |
8592 | 8605 |
8593 // Check whether the arguments shadow object exists. | 8606 // Check whether the arguments shadow object exists. |
8594 int arguments_shadow_index = | 8607 int arguments_shadow_index = |
8595 ScopeInfo<>::ContextSlotIndex(*code, | 8608 ScopeInfo<>::ContextSlotIndex(*code, |
8596 HEAP->arguments_shadow_symbol(), | 8609 HEAP->arguments_shadow_symbol(), |
8597 NULL); | 8610 NULL); |
8598 if (arguments_shadow_index >= 0) { | 8611 if (arguments_shadow_index >= 0) { |
8599 // In this case all the arguments are available in the arguments shadow | 8612 // In this case all the arguments are available in the arguments shadow |
8600 // object. | 8613 // object. |
8601 Handle<JSObject> arguments_shadow( | 8614 Handle<JSObject> arguments_shadow( |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8939 ScopedVector<OS::StackFrame> frames(kMaxCFramesSize); | 8952 ScopedVector<OS::StackFrame> frames(kMaxCFramesSize); |
8940 int frames_count = OS::StackWalk(frames); | 8953 int frames_count = OS::StackWalk(frames); |
8941 if (frames_count == OS::kStackWalkError) { | 8954 if (frames_count == OS::kStackWalkError) { |
8942 return HEAP->undefined_value(); | 8955 return HEAP->undefined_value(); |
8943 } | 8956 } |
8944 | 8957 |
8945 Handle<String> address_str = Factory::LookupAsciiSymbol("address"); | 8958 Handle<String> address_str = Factory::LookupAsciiSymbol("address"); |
8946 Handle<String> text_str = Factory::LookupAsciiSymbol("text"); | 8959 Handle<String> text_str = Factory::LookupAsciiSymbol("text"); |
8947 Handle<FixedArray> frames_array = Factory::NewFixedArray(frames_count); | 8960 Handle<FixedArray> frames_array = Factory::NewFixedArray(frames_count); |
8948 for (int i = 0; i < frames_count; i++) { | 8961 for (int i = 0; i < frames_count; i++) { |
8949 Handle<JSObject> frame_value = Factory::NewJSObject(Top::object_function()); | 8962 Handle<JSObject> frame_value = |
| 8963 Factory::NewJSObject(Isolate::Current()->object_function()); |
8950 frame_value->SetProperty( | 8964 frame_value->SetProperty( |
8951 *address_str, | 8965 *address_str, |
8952 *Factory::NewNumberFromInt(reinterpret_cast<int>(frames[i].address)), | 8966 *Factory::NewNumberFromInt(reinterpret_cast<int>(frames[i].address)), |
8953 NONE); | 8967 NONE); |
8954 | 8968 |
8955 // Get the stack walk text for this frame. | 8969 // Get the stack walk text for this frame. |
8956 Handle<String> frame_text; | 8970 Handle<String> frame_text; |
8957 int frame_text_length = StrLength(frames[i].text); | 8971 int frame_text_length = StrLength(frames[i].text); |
8958 if (frame_text_length > 0) { | 8972 if (frame_text_length > 0) { |
8959 Vector<const char> str(frames[i].text, frame_text_length); | 8973 Vector<const char> str(frames[i].text, frame_text_length); |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9245 // args[1]: step action from the enumeration StepAction | 9259 // args[1]: step action from the enumeration StepAction |
9246 // args[2]: number of times to perform the step, for step out it is the number | 9260 // args[2]: number of times to perform the step, for step out it is the number |
9247 // of frames to step down. | 9261 // of frames to step down. |
9248 static Object* Runtime_PrepareStep(Arguments args) { | 9262 static Object* Runtime_PrepareStep(Arguments args) { |
9249 HandleScope scope; | 9263 HandleScope scope; |
9250 ASSERT(args.length() == 3); | 9264 ASSERT(args.length() == 3); |
9251 // Check arguments. | 9265 // Check arguments. |
9252 Object* check = Runtime_CheckExecutionState(args); | 9266 Object* check = Runtime_CheckExecutionState(args); |
9253 if (check->IsFailure()) return check; | 9267 if (check->IsFailure()) return check; |
9254 if (!args[1]->IsNumber() || !args[2]->IsNumber()) { | 9268 if (!args[1]->IsNumber() || !args[2]->IsNumber()) { |
9255 return Top::Throw(HEAP->illegal_argument_symbol()); | 9269 return Isolate::Current()->Throw(HEAP->illegal_argument_symbol()); |
9256 } | 9270 } |
9257 | 9271 |
9258 // Get the step action and check validity. | 9272 // Get the step action and check validity. |
9259 StepAction step_action = static_cast<StepAction>(NumberToInt32(args[1])); | 9273 StepAction step_action = static_cast<StepAction>(NumberToInt32(args[1])); |
9260 if (step_action != StepIn && | 9274 if (step_action != StepIn && |
9261 step_action != StepNext && | 9275 step_action != StepNext && |
9262 step_action != StepOut && | 9276 step_action != StepOut && |
9263 step_action != StepInMin && | 9277 step_action != StepInMin && |
9264 step_action != StepMin) { | 9278 step_action != StepMin) { |
9265 return Top::Throw(HEAP->illegal_argument_symbol()); | 9279 return Isolate::Current()->Throw(HEAP->illegal_argument_symbol()); |
9266 } | 9280 } |
9267 | 9281 |
9268 // Get the number of steps. | 9282 // Get the number of steps. |
9269 int step_count = NumberToInt32(args[2]); | 9283 int step_count = NumberToInt32(args[2]); |
9270 if (step_count < 1) { | 9284 if (step_count < 1) { |
9271 return Top::Throw(HEAP->illegal_argument_symbol()); | 9285 return Isolate::Current()->Throw(HEAP->illegal_argument_symbol()); |
9272 } | 9286 } |
9273 | 9287 |
9274 // Clear all current stepping setup. | 9288 // Clear all current stepping setup. |
9275 Debug::ClearStepping(); | 9289 Debug::ClearStepping(); |
9276 | 9290 |
9277 // Prepare step. | 9291 // Prepare step. |
9278 Debug::PrepareStep(static_cast<StepAction>(step_action), step_count); | 9292 Debug::PrepareStep(static_cast<StepAction>(step_action), step_count); |
9279 return HEAP->undefined_value(); | 9293 return HEAP->undefined_value(); |
9280 } | 9294 } |
9281 | 9295 |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9377 // Get the frame where the debugging is performed. | 9391 // Get the frame where the debugging is performed. |
9378 StackFrame::Id id = UnwrapFrameId(wrapped_id); | 9392 StackFrame::Id id = UnwrapFrameId(wrapped_id); |
9379 JavaScriptFrameIterator it(id); | 9393 JavaScriptFrameIterator it(id); |
9380 JavaScriptFrame* frame = it.frame(); | 9394 JavaScriptFrame* frame = it.frame(); |
9381 Handle<JSFunction> function(JSFunction::cast(frame->function())); | 9395 Handle<JSFunction> function(JSFunction::cast(frame->function())); |
9382 Handle<Code> code(function->code()); | 9396 Handle<Code> code(function->code()); |
9383 ScopeInfo<> sinfo(*code); | 9397 ScopeInfo<> sinfo(*code); |
9384 | 9398 |
9385 // Traverse the saved contexts chain to find the active context for the | 9399 // Traverse the saved contexts chain to find the active context for the |
9386 // selected frame. | 9400 // selected frame. |
9387 SaveContext* save = Top::save_context(); | 9401 SaveContext* save = Isolate::Current()->save_context(); |
9388 while (save != NULL && !save->below(frame)) { | 9402 while (save != NULL && !save->below(frame)) { |
9389 save = save->prev(); | 9403 save = save->prev(); |
9390 } | 9404 } |
9391 ASSERT(save != NULL); | 9405 ASSERT(save != NULL); |
9392 SaveContext savex; | 9406 SaveContext savex; |
9393 Top::set_context(*(save->context())); | 9407 Isolate::Current()->set_context(*(save->context())); |
9394 | 9408 |
9395 // Create the (empty) function replacing the function on the stack frame for | 9409 // Create the (empty) function replacing the function on the stack frame for |
9396 // the purpose of evaluating in the context created below. It is important | 9410 // the purpose of evaluating in the context created below. It is important |
9397 // that this function does not describe any parameters and local variables | 9411 // that this function does not describe any parameters and local variables |
9398 // in the context. If it does then this will cause problems with the lookup | 9412 // in the context. If it does then this will cause problems with the lookup |
9399 // in Context::Lookup, where context slots for parameters and local variables | 9413 // in Context::Lookup, where context slots for parameters and local variables |
9400 // are looked at before the extension object. | 9414 // are looked at before the extension object. |
9401 Handle<JSFunction> go_between = | 9415 Handle<JSFunction> go_between = |
9402 Factory::NewFunction(Factory::empty_string(), Factory::undefined_value()); | 9416 Factory::NewFunction(Factory::empty_string(), Factory::undefined_value()); |
9403 go_between->set_context(function->context()); | 9417 go_between->set_context(function->context()); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9484 // Handle the processing of break. | 9498 // Handle the processing of break. |
9485 DisableBreak disable_break_save(disable_break); | 9499 DisableBreak disable_break_save(disable_break); |
9486 | 9500 |
9487 // Enter the top context from before the debugger was invoked. | 9501 // Enter the top context from before the debugger was invoked. |
9488 SaveContext save; | 9502 SaveContext save; |
9489 SaveContext* top = &save; | 9503 SaveContext* top = &save; |
9490 while (top != NULL && *top->context() == *Debug::debug_context()) { | 9504 while (top != NULL && *top->context() == *Debug::debug_context()) { |
9491 top = top->prev(); | 9505 top = top->prev(); |
9492 } | 9506 } |
9493 if (top != NULL) { | 9507 if (top != NULL) { |
9494 Top::set_context(*top->context()); | 9508 Isolate::Current()->set_context(*top->context()); |
9495 } | 9509 } |
9496 | 9510 |
9497 // Get the global context now set to the top context from before the | 9511 // Get the global context now set to the top context from before the |
9498 // debugger was invoked. | 9512 // debugger was invoked. |
9499 Handle<Context> context = Top::global_context(); | 9513 Handle<Context> context = Isolate::Current()->global_context(); |
9500 | 9514 |
9501 // Compile the source to be evaluated. | 9515 // Compile the source to be evaluated. |
9502 Handle<SharedFunctionInfo> shared = | 9516 Handle<SharedFunctionInfo> shared = |
9503 Compiler::CompileEval(source, | 9517 Compiler::CompileEval(source, |
9504 context, | 9518 context, |
9505 true, | 9519 true, |
9506 Compiler::DONT_VALIDATE_JSON); | 9520 Compiler::DONT_VALIDATE_JSON); |
9507 if (shared.is_null()) return Failure::Exception(); | 9521 if (shared.is_null()) return Failure::Exception(); |
9508 Handle<JSFunction> compiled_function = | 9522 Handle<JSFunction> compiled_function = |
9509 Handle<JSFunction>(Factory::NewFunctionFromSharedFunctionInfo(shared, | 9523 Handle<JSFunction>(Factory::NewFunctionFromSharedFunctionInfo(shared, |
9510 context)); | 9524 context)); |
9511 | 9525 |
9512 // Invoke the result of the compilation to get the evaluation function. | 9526 // Invoke the result of the compilation to get the evaluation function. |
9513 bool has_pending_exception; | 9527 bool has_pending_exception; |
9514 Handle<Object> receiver = Top::global(); | 9528 Handle<Object> receiver = Isolate::Current()->global(); |
9515 Handle<Object> result = | 9529 Handle<Object> result = |
9516 Execution::Call(compiled_function, receiver, 0, NULL, | 9530 Execution::Call(compiled_function, receiver, 0, NULL, |
9517 &has_pending_exception); | 9531 &has_pending_exception); |
9518 if (has_pending_exception) return Failure::Exception(); | 9532 if (has_pending_exception) return Failure::Exception(); |
9519 return *result; | 9533 return *result; |
9520 } | 9534 } |
9521 | 9535 |
9522 | 9536 |
9523 static Object* Runtime_DebugGetLoadedScripts(Arguments args) { | 9537 static Object* Runtime_DebugGetLoadedScripts(Arguments args) { |
9524 HandleScope scope; | 9538 HandleScope scope; |
9525 ASSERT(args.length() == 0); | 9539 ASSERT(args.length() == 0); |
9526 | 9540 |
9527 // Fill the script objects. | 9541 // Fill the script objects. |
9528 Handle<FixedArray> instances = Debug::GetLoadedScripts(); | 9542 Handle<FixedArray> instances = Debug::GetLoadedScripts(); |
9529 | 9543 |
9530 // Convert the script objects to proper JS objects. | 9544 // Convert the script objects to proper JS objects. |
9531 for (int i = 0; i < instances->length(); i++) { | 9545 for (int i = 0; i < instances->length(); i++) { |
9532 Handle<Script> script = Handle<Script>(Script::cast(instances->get(i))); | 9546 Handle<Script> script = Handle<Script>(Script::cast(instances->get(i))); |
9533 // Get the script wrapper in a local handle before calling GetScriptWrapper, | 9547 // Get the script wrapper in a local handle before calling GetScriptWrapper, |
9534 // because using | 9548 // because using |
9535 // instances->set(i, *GetScriptWrapper(script)) | 9549 // instances->set(i, *GetScriptWrapper(script)) |
9536 // is unsafe as GetScriptWrapper might call GC and the C++ compiler might | 9550 // is unsafe as GetScriptWrapper might call GC and the C++ compiler might |
9537 // already have deferenced the instances handle. | 9551 // already have deferenced the instances handle. |
9538 Handle<JSValue> wrapper = GetScriptWrapper(script); | 9552 Handle<JSValue> wrapper = GetScriptWrapper(script); |
9539 instances->set(i, *wrapper); | 9553 instances->set(i, *wrapper); |
9540 } | 9554 } |
9541 | 9555 |
9542 // Return result as a JS array. | 9556 // Return result as a JS array. |
9543 Handle<JSObject> result = Factory::NewJSObject(Top::array_function()); | 9557 Handle<JSObject> result = Factory::NewJSObject( |
| 9558 Isolate::Current()->array_function()); |
9544 Handle<JSArray>::cast(result)->SetContent(*instances); | 9559 Handle<JSArray>::cast(result)->SetContent(*instances); |
9545 return *result; | 9560 return *result; |
9546 } | 9561 } |
9547 | 9562 |
9548 | 9563 |
9549 // Helper function used by Runtime_DebugReferencedBy below. | 9564 // Helper function used by Runtime_DebugReferencedBy below. |
9550 static int DebugReferencedBy(JSObject* target, | 9565 static int DebugReferencedBy(JSObject* target, |
9551 Object* instance_filter, int max_references, | 9566 Object* instance_filter, int max_references, |
9552 FixedArray* instances, int instances_size, | 9567 FixedArray* instances, int instances_size, |
9553 JSFunction* arguments_function) { | 9568 JSFunction* arguments_function) { |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9629 // Check parameters. | 9644 // Check parameters. |
9630 CONVERT_CHECKED(JSObject, target, args[0]); | 9645 CONVERT_CHECKED(JSObject, target, args[0]); |
9631 Object* instance_filter = args[1]; | 9646 Object* instance_filter = args[1]; |
9632 RUNTIME_ASSERT(instance_filter->IsUndefined() || | 9647 RUNTIME_ASSERT(instance_filter->IsUndefined() || |
9633 instance_filter->IsJSObject()); | 9648 instance_filter->IsJSObject()); |
9634 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[2]); | 9649 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[2]); |
9635 RUNTIME_ASSERT(max_references >= 0); | 9650 RUNTIME_ASSERT(max_references >= 0); |
9636 | 9651 |
9637 // Get the constructor function for context extension and arguments array. | 9652 // Get the constructor function for context extension and arguments array. |
9638 JSObject* arguments_boilerplate = | 9653 JSObject* arguments_boilerplate = |
9639 Top::context()->global_context()->arguments_boilerplate(); | 9654 Isolate::Current()->context()->global_context()->arguments_boilerplate(); |
9640 JSFunction* arguments_function = | 9655 JSFunction* arguments_function = |
9641 JSFunction::cast(arguments_boilerplate->map()->constructor()); | 9656 JSFunction::cast(arguments_boilerplate->map()->constructor()); |
9642 | 9657 |
9643 // Get the number of referencing objects. | 9658 // Get the number of referencing objects. |
9644 int count; | 9659 int count; |
9645 count = DebugReferencedBy(target, instance_filter, max_references, | 9660 count = DebugReferencedBy(target, instance_filter, max_references, |
9646 NULL, 0, arguments_function); | 9661 NULL, 0, arguments_function); |
9647 | 9662 |
9648 // Allocate an array to hold the result. | 9663 // Allocate an array to hold the result. |
9649 Object* object = HEAP->AllocateFixedArray(count); | 9664 Object* object = HEAP->AllocateFixedArray(count); |
9650 if (object->IsFailure()) return object; | 9665 if (object->IsFailure()) return object; |
9651 FixedArray* instances = FixedArray::cast(object); | 9666 FixedArray* instances = FixedArray::cast(object); |
9652 | 9667 |
9653 // Fill the referencing objects. | 9668 // Fill the referencing objects. |
9654 count = DebugReferencedBy(target, instance_filter, max_references, | 9669 count = DebugReferencedBy(target, instance_filter, max_references, |
9655 instances, count, arguments_function); | 9670 instances, count, arguments_function); |
9656 | 9671 |
9657 // Return result as JS array. | 9672 // Return result as JS array. |
9658 Object* result = | 9673 Object* result = |
9659 HEAP->AllocateJSObject( | 9674 HEAP->AllocateJSObject( |
9660 Top::context()->global_context()->array_function()); | 9675 Isolate::Current()->context()->global_context()->array_function()); |
9661 if (!result->IsFailure()) JSArray::cast(result)->SetContent(instances); | 9676 if (!result->IsFailure()) JSArray::cast(result)->SetContent(instances); |
9662 return result; | 9677 return result; |
9663 } | 9678 } |
9664 | 9679 |
9665 | 9680 |
9666 // Helper function used by Runtime_DebugConstructedBy below. | 9681 // Helper function used by Runtime_DebugConstructedBy below. |
9667 static int DebugConstructedBy(JSFunction* constructor, int max_references, | 9682 static int DebugConstructedBy(JSFunction* constructor, int max_references, |
9668 FixedArray* instances, int instances_size) { | 9683 FixedArray* instances, int instances_size) { |
9669 AssertNoAllocation no_alloc; | 9684 AssertNoAllocation no_alloc; |
9670 | 9685 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9715 Object* object = HEAP->AllocateFixedArray(count); | 9730 Object* object = HEAP->AllocateFixedArray(count); |
9716 if (object->IsFailure()) return object; | 9731 if (object->IsFailure()) return object; |
9717 FixedArray* instances = FixedArray::cast(object); | 9732 FixedArray* instances = FixedArray::cast(object); |
9718 | 9733 |
9719 // Fill the referencing objects. | 9734 // Fill the referencing objects. |
9720 count = DebugConstructedBy(constructor, max_references, instances, count); | 9735 count = DebugConstructedBy(constructor, max_references, instances, count); |
9721 | 9736 |
9722 // Return result as JS array. | 9737 // Return result as JS array. |
9723 Object* result = | 9738 Object* result = |
9724 HEAP->AllocateJSObject( | 9739 HEAP->AllocateJSObject( |
9725 Top::context()->global_context()->array_function()); | 9740 Isolate::Current()->context()->global_context()->array_function()); |
9726 if (!result->IsFailure()) JSArray::cast(result)->SetContent(instances); | 9741 if (!result->IsFailure()) JSArray::cast(result)->SetContent(instances); |
9727 return result; | 9742 return result; |
9728 } | 9743 } |
9729 | 9744 |
9730 | 9745 |
9731 // Find the effective prototype object as returned by __proto__. | 9746 // Find the effective prototype object as returned by __proto__. |
9732 // args[0]: the object to find the prototype for. | 9747 // args[0]: the object to find the prototype for. |
9733 static Object* Runtime_DebugGetPrototype(Arguments args) { | 9748 static Object* Runtime_DebugGetPrototype(Arguments args) { |
9734 ASSERT(args.length() == 1); | 9749 ASSERT(args.length() == 1); |
9735 | 9750 |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9850 // with the function itself going first. The root function is a script function. | 9865 // with the function itself going first. The root function is a script function. |
9851 static Object* Runtime_LiveEditGatherCompileInfo(Arguments args) { | 9866 static Object* Runtime_LiveEditGatherCompileInfo(Arguments args) { |
9852 ASSERT(args.length() == 2); | 9867 ASSERT(args.length() == 2); |
9853 HandleScope scope; | 9868 HandleScope scope; |
9854 CONVERT_CHECKED(JSValue, script, args[0]); | 9869 CONVERT_CHECKED(JSValue, script, args[0]); |
9855 CONVERT_ARG_CHECKED(String, source, 1); | 9870 CONVERT_ARG_CHECKED(String, source, 1); |
9856 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); | 9871 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); |
9857 | 9872 |
9858 JSArray* result = LiveEdit::GatherCompileInfo(script_handle, source); | 9873 JSArray* result = LiveEdit::GatherCompileInfo(script_handle, source); |
9859 | 9874 |
9860 if (Top::has_pending_exception()) { | 9875 if (Isolate::Current()->has_pending_exception()) { |
9861 return Failure::Exception(); | 9876 return Failure::Exception(); |
9862 } | 9877 } |
9863 | 9878 |
9864 return result; | 9879 return result; |
9865 } | 9880 } |
9866 | 9881 |
9867 // Changes the source of the script to a new_source. | 9882 // Changes the source of the script to a new_source. |
9868 // If old_script_name is provided (i.e. is a String), also creates a copy of | 9883 // If old_script_name is provided (i.e. is a String), also creates a copy of |
9869 // the script with its original source and sends notification to debugger. | 9884 // the script with its original source and sends notification to debugger. |
9870 static Object* Runtime_LiveEditReplaceScript(Arguments args) { | 9885 static Object* Runtime_LiveEditReplaceScript(Arguments args) { |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10019 static Object* Runtime_ExecuteInDebugContext(Arguments args) { | 10034 static Object* Runtime_ExecuteInDebugContext(Arguments args) { |
10020 ASSERT(args.length() == 2); | 10035 ASSERT(args.length() == 2); |
10021 HandleScope scope; | 10036 HandleScope scope; |
10022 CONVERT_ARG_CHECKED(JSFunction, function, 0); | 10037 CONVERT_ARG_CHECKED(JSFunction, function, 0); |
10023 CONVERT_BOOLEAN_CHECKED(without_debugger, args[1]); | 10038 CONVERT_BOOLEAN_CHECKED(without_debugger, args[1]); |
10024 | 10039 |
10025 Handle<Object> result; | 10040 Handle<Object> result; |
10026 bool pending_exception; | 10041 bool pending_exception; |
10027 { | 10042 { |
10028 if (without_debugger) { | 10043 if (without_debugger) { |
10029 result = Execution::Call(function, Top::global(), 0, NULL, | 10044 result = Execution::Call(function, Isolate::Current()->global(), 0, NULL, |
10030 &pending_exception); | 10045 &pending_exception); |
10031 } else { | 10046 } else { |
10032 EnterDebugger enter_debugger; | 10047 EnterDebugger enter_debugger; |
10033 result = Execution::Call(function, Top::global(), 0, NULL, | 10048 result = Execution::Call(function, Isolate::Current()->global(), 0, NULL, |
10034 &pending_exception); | 10049 &pending_exception); |
10035 } | 10050 } |
10036 } | 10051 } |
10037 if (!pending_exception) { | 10052 if (!pending_exception) { |
10038 return *result; | 10053 return *result; |
10039 } else { | 10054 } else { |
10040 return Failure::Exception(); | 10055 return Failure::Exception(); |
10041 } | 10056 } |
10042 } | 10057 } |
10043 | 10058 |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10207 const char* version_string = v8::V8::GetVersion(); | 10222 const char* version_string = v8::V8::GetVersion(); |
10208 | 10223 |
10209 return HEAP->AllocateStringFromAscii(CStrVector(version_string), NOT_TENURED); | 10224 return HEAP->AllocateStringFromAscii(CStrVector(version_string), NOT_TENURED); |
10210 } | 10225 } |
10211 | 10226 |
10212 | 10227 |
10213 static Object* Runtime_Abort(Arguments args) { | 10228 static Object* Runtime_Abort(Arguments args) { |
10214 ASSERT(args.length() == 2); | 10229 ASSERT(args.length() == 2); |
10215 OS::PrintError("abort: %s\n", reinterpret_cast<char*>(args[0]) + | 10230 OS::PrintError("abort: %s\n", reinterpret_cast<char*>(args[0]) + |
10216 Smi::cast(args[1])->value()); | 10231 Smi::cast(args[1])->value()); |
10217 Top::PrintStack(); | 10232 Isolate::Current()->PrintStack(); |
10218 OS::Abort(); | 10233 OS::Abort(); |
10219 UNREACHABLE(); | 10234 UNREACHABLE(); |
10220 return NULL; | 10235 return NULL; |
10221 } | 10236 } |
10222 | 10237 |
10223 | 10238 |
10224 static Object* Runtime_DeleteHandleScopeExtensions(Arguments args) { | 10239 static Object* Runtime_DeleteHandleScopeExtensions(Arguments args) { |
10225 ASSERT(args.length() == 0); | 10240 ASSERT(args.length() == 0); |
10226 Isolate* isolate = Isolate::Current(); | 10241 Isolate* isolate = Isolate::Current(); |
10227 HandleScope::DeleteExtensions(isolate); | 10242 HandleScope::DeleteExtensions(isolate); |
10228 return isolate->heap()->undefined_value(); | 10243 return isolate->heap()->undefined_value(); |
10229 } | 10244 } |
10230 | 10245 |
10231 | 10246 |
10232 static Object* CacheMiss(FixedArray* cache_obj, int index, Object* key_obj) { | 10247 static Object* CacheMiss(FixedArray* cache_obj, int index, Object* key_obj) { |
10233 ASSERT(index % 2 == 0); // index of the key | 10248 ASSERT(index % 2 == 0); // index of the key |
10234 ASSERT(index >= JSFunctionResultCache::kEntriesIndex); | 10249 ASSERT(index >= JSFunctionResultCache::kEntriesIndex); |
10235 ASSERT(index < cache_obj->length()); | 10250 ASSERT(index < cache_obj->length()); |
10236 | 10251 |
10237 HandleScope scope; | 10252 HandleScope scope; |
10238 | 10253 |
10239 Handle<FixedArray> cache(cache_obj); | 10254 Handle<FixedArray> cache(cache_obj); |
10240 Handle<Object> key(key_obj); | 10255 Handle<Object> key(key_obj); |
10241 Handle<JSFunction> factory(JSFunction::cast( | 10256 Handle<JSFunction> factory(JSFunction::cast( |
10242 cache->get(JSFunctionResultCache::kFactoryIndex))); | 10257 cache->get(JSFunctionResultCache::kFactoryIndex))); |
10243 // TODO(antonm): consider passing a receiver when constructing a cache. | 10258 // TODO(antonm): consider passing a receiver when constructing a cache. |
10244 Handle<Object> receiver(Top::global_context()->global()); | 10259 Handle<Object> receiver(Isolate::Current()->global_context()->global()); |
10245 | 10260 |
10246 Handle<Object> value; | 10261 Handle<Object> value; |
10247 { | 10262 { |
10248 // This handle is nor shared, nor used later, so it's safe. | 10263 // This handle is nor shared, nor used later, so it's safe. |
10249 Object** argv[] = { key.location() }; | 10264 Object** argv[] = { key.location() }; |
10250 bool pending_exception = false; | 10265 bool pending_exception = false; |
10251 value = Execution::Call(factory, | 10266 value = Execution::Call(factory, |
10252 receiver, | 10267 receiver, |
10253 1, | 10268 1, |
10254 argv, | 10269 argv, |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10406 } else { | 10421 } else { |
10407 // Handle last resort GC and make sure to allow future allocations | 10422 // Handle last resort GC and make sure to allow future allocations |
10408 // to grow the heap without causing GCs (if possible). | 10423 // to grow the heap without causing GCs (if possible). |
10409 Counters::gc_last_resort_from_js.Increment(); | 10424 Counters::gc_last_resort_from_js.Increment(); |
10410 HEAP->CollectAllGarbage(false); | 10425 HEAP->CollectAllGarbage(false); |
10411 } | 10426 } |
10412 } | 10427 } |
10413 | 10428 |
10414 | 10429 |
10415 } } // namespace v8::internal | 10430 } } // namespace v8::internal |
OLD | NEW |