| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 941 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 952 // We don't expect access checks to be needed on JSProxy objects. | 952 // We don't expect access checks to be needed on JSProxy objects. |
| 953 ASSERT(!obj->IsAccessCheckNeeded() || obj->IsJSObject()); | 953 ASSERT(!obj->IsAccessCheckNeeded() || obj->IsJSObject()); |
| 954 do { | 954 do { |
| 955 if (obj->IsAccessCheckNeeded() && | 955 if (obj->IsAccessCheckNeeded() && |
| 956 !isolate->MayNamedAccess(JSObject::cast(obj), | 956 !isolate->MayNamedAccess(JSObject::cast(obj), |
| 957 isolate->heap()->Proto_symbol(), | 957 isolate->heap()->Proto_symbol(), |
| 958 v8::ACCESS_GET)) { | 958 v8::ACCESS_GET)) { |
| 959 isolate->ReportFailedAccessCheck(JSObject::cast(obj), v8::ACCESS_GET); | 959 isolate->ReportFailedAccessCheck(JSObject::cast(obj), v8::ACCESS_GET); |
| 960 return isolate->heap()->undefined_value(); | 960 return isolate->heap()->undefined_value(); |
| 961 } | 961 } |
| 962 obj = obj->GetPrototype(); | 962 obj = obj->GetPrototype(isolate); |
| 963 } while (obj->IsJSObject() && | 963 } while (obj->IsJSObject() && |
| 964 JSObject::cast(obj)->map()->is_hidden_prototype()); | 964 JSObject::cast(obj)->map()->is_hidden_prototype()); |
| 965 return obj; | 965 return obj; |
| 966 } | 966 } |
| 967 | 967 |
| 968 | 968 |
| 969 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsInPrototypeChain) { | 969 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsInPrototypeChain) { |
| 970 NoHandleAllocation ha(isolate); | 970 NoHandleAllocation ha(isolate); |
| 971 ASSERT(args.length() == 2); | 971 ASSERT(args.length() == 2); |
| 972 // See ECMA-262, section 15.3.5.3, page 88 (steps 5 - 8). | 972 // See ECMA-262, section 15.3.5.3, page 88 (steps 5 - 8). |
| 973 Object* O = args[0]; | 973 Object* O = args[0]; |
| 974 Object* V = args[1]; | 974 Object* V = args[1]; |
| 975 while (true) { | 975 while (true) { |
| 976 Object* prototype = V->GetPrototype(); | 976 Object* prototype = V->GetPrototype(isolate); |
| 977 if (prototype->IsNull()) return isolate->heap()->false_value(); | 977 if (prototype->IsNull()) return isolate->heap()->false_value(); |
| 978 if (O == prototype) return isolate->heap()->true_value(); | 978 if (O == prototype) return isolate->heap()->true_value(); |
| 979 V = prototype; | 979 V = prototype; |
| 980 } | 980 } |
| 981 } | 981 } |
| 982 | 982 |
| 983 | 983 |
| 984 static bool CheckAccessException(Object* callback, | 984 static bool CheckAccessException(Object* callback, |
| 985 v8::AccessType access_type) { | 985 v8::AccessType access_type) { |
| 986 if (callback->IsAccessorInfo()) { | 986 if (callback->IsAccessorInfo()) { |
| (...skipping 2905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3892 | 3892 |
| 3893 // Handle [] indexing on String objects | 3893 // Handle [] indexing on String objects |
| 3894 if (object->IsStringObjectWithCharacterAt(index)) { | 3894 if (object->IsStringObjectWithCharacterAt(index)) { |
| 3895 Handle<JSValue> js_value = Handle<JSValue>::cast(object); | 3895 Handle<JSValue> js_value = Handle<JSValue>::cast(object); |
| 3896 Handle<Object> result = | 3896 Handle<Object> result = |
| 3897 GetCharAt(Handle<String>(String::cast(js_value->value())), index); | 3897 GetCharAt(Handle<String>(String::cast(js_value->value())), index); |
| 3898 if (!result->IsUndefined()) return *result; | 3898 if (!result->IsUndefined()) return *result; |
| 3899 } | 3899 } |
| 3900 | 3900 |
| 3901 if (object->IsString() || object->IsNumber() || object->IsBoolean()) { | 3901 if (object->IsString() || object->IsNumber() || object->IsBoolean()) { |
| 3902 return object->GetPrototype()->GetElement(index); | 3902 return object->GetPrototype(isolate)->GetElement(index); |
| 3903 } | 3903 } |
| 3904 | 3904 |
| 3905 return object->GetElement(index); | 3905 return object->GetElement(index); |
| 3906 } | 3906 } |
| 3907 | 3907 |
| 3908 | 3908 |
| 3909 MaybeObject* Runtime::GetObjectProperty(Isolate* isolate, | 3909 MaybeObject* Runtime::GetObjectProperty(Isolate* isolate, |
| 3910 Handle<Object> object, | 3910 Handle<Object> object, |
| 3911 Handle<Object> key) { | 3911 Handle<Object> key) { |
| 3912 HandleScope scope(isolate); | 3912 HandleScope scope(isolate); |
| (...skipping 8119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12032 &has_pending_exception); | 12032 &has_pending_exception); |
| 12033 if (eval_disabled) { | 12033 if (eval_disabled) { |
| 12034 native_context->set_allow_code_gen_from_strings( | 12034 native_context->set_allow_code_gen_from_strings( |
| 12035 isolate->heap()->false_value()); | 12035 isolate->heap()->false_value()); |
| 12036 } | 12036 } |
| 12037 if (has_pending_exception) return Failure::Exception(); | 12037 if (has_pending_exception) return Failure::Exception(); |
| 12038 | 12038 |
| 12039 // Skip the global proxy as it has no properties and always delegates to the | 12039 // Skip the global proxy as it has no properties and always delegates to the |
| 12040 // real global object. | 12040 // real global object. |
| 12041 if (result->IsJSGlobalProxy()) { | 12041 if (result->IsJSGlobalProxy()) { |
| 12042 result = Handle<JSObject>(JSObject::cast(result->GetPrototype())); | 12042 result = Handle<JSObject>(JSObject::cast(result->GetPrototype(isolate))); |
| 12043 } | 12043 } |
| 12044 | 12044 |
| 12045 return *result; | 12045 return *result; |
| 12046 } | 12046 } |
| 12047 | 12047 |
| 12048 | 12048 |
| 12049 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugEvaluateGlobal) { | 12049 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugEvaluateGlobal) { |
| 12050 HandleScope scope(isolate); | 12050 HandleScope scope(isolate); |
| 12051 | 12051 |
| 12052 // Check the execution state and decode arguments frame and source to be | 12052 // Check the execution state and decode arguments frame and source to be |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12146 return *result; | 12146 return *result; |
| 12147 } | 12147 } |
| 12148 | 12148 |
| 12149 | 12149 |
| 12150 // Helper function used by Runtime_DebugReferencedBy below. | 12150 // Helper function used by Runtime_DebugReferencedBy below. |
| 12151 static int DebugReferencedBy(HeapIterator* iterator, | 12151 static int DebugReferencedBy(HeapIterator* iterator, |
| 12152 JSObject* target, | 12152 JSObject* target, |
| 12153 Object* instance_filter, int max_references, | 12153 Object* instance_filter, int max_references, |
| 12154 FixedArray* instances, int instances_size, | 12154 FixedArray* instances, int instances_size, |
| 12155 JSFunction* arguments_function) { | 12155 JSFunction* arguments_function) { |
| 12156 NoHandleAllocation ha(target->GetIsolate()); | 12156 Isolate* isolate = target->GetIsolate(); |
| 12157 NoHandleAllocation ha(isolate); |
| 12157 AssertNoAllocation no_alloc; | 12158 AssertNoAllocation no_alloc; |
| 12158 | 12159 |
| 12159 // Iterate the heap. | 12160 // Iterate the heap. |
| 12160 int count = 0; | 12161 int count = 0; |
| 12161 JSObject* last = NULL; | 12162 JSObject* last = NULL; |
| 12162 HeapObject* heap_obj = NULL; | 12163 HeapObject* heap_obj = NULL; |
| 12163 while (((heap_obj = iterator->next()) != NULL) && | 12164 while (((heap_obj = iterator->next()) != NULL) && |
| 12164 (max_references == 0 || count < max_references)) { | 12165 (max_references == 0 || count < max_references)) { |
| 12165 // Only look at all JSObjects. | 12166 // Only look at all JSObjects. |
| 12166 if (heap_obj->IsJSObject()) { | 12167 if (heap_obj->IsJSObject()) { |
| 12167 // Skip context extension objects and argument arrays as these are | 12168 // Skip context extension objects and argument arrays as these are |
| 12168 // checked in the context of functions using them. | 12169 // checked in the context of functions using them. |
| 12169 JSObject* obj = JSObject::cast(heap_obj); | 12170 JSObject* obj = JSObject::cast(heap_obj); |
| 12170 if (obj->IsJSContextExtensionObject() || | 12171 if (obj->IsJSContextExtensionObject() || |
| 12171 obj->map()->constructor() == arguments_function) { | 12172 obj->map()->constructor() == arguments_function) { |
| 12172 continue; | 12173 continue; |
| 12173 } | 12174 } |
| 12174 | 12175 |
| 12175 // Check if the JS object has a reference to the object looked for. | 12176 // Check if the JS object has a reference to the object looked for. |
| 12176 if (obj->ReferencesObject(target)) { | 12177 if (obj->ReferencesObject(target)) { |
| 12177 // Check instance filter if supplied. This is normally used to avoid | 12178 // Check instance filter if supplied. This is normally used to avoid |
| 12178 // references from mirror objects (see Runtime_IsInPrototypeChain). | 12179 // references from mirror objects (see Runtime_IsInPrototypeChain). |
| 12179 if (!instance_filter->IsUndefined()) { | 12180 if (!instance_filter->IsUndefined()) { |
| 12180 Object* V = obj; | 12181 Object* V = obj; |
| 12181 while (true) { | 12182 while (true) { |
| 12182 Object* prototype = V->GetPrototype(); | 12183 Object* prototype = V->GetPrototype(isolate); |
| 12183 if (prototype->IsNull()) { | 12184 if (prototype->IsNull()) { |
| 12184 break; | 12185 break; |
| 12185 } | 12186 } |
| 12186 if (instance_filter == prototype) { | 12187 if (instance_filter == prototype) { |
| 12187 obj = NULL; // Don't add this object. | 12188 obj = NULL; // Don't add this object. |
| 12188 break; | 12189 break; |
| 12189 } | 12190 } |
| 12190 V = prototype; | 12191 V = prototype; |
| 12191 } | 12192 } |
| 12192 } | 12193 } |
| (...skipping 1049 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13242 Handle<JSWeakMap> weakmap = | 13243 Handle<JSWeakMap> weakmap = |
| 13243 Handle<JSWeakMap>::cast(isolate->factory()->NewJSObjectFromMap(map)); | 13244 Handle<JSWeakMap>::cast(isolate->factory()->NewJSObjectFromMap(map)); |
| 13244 return WeakMapInitialize(isolate, weakmap); | 13245 return WeakMapInitialize(isolate, weakmap); |
| 13245 } | 13246 } |
| 13246 | 13247 |
| 13247 | 13248 |
| 13248 RUNTIME_FUNCTION(MaybeObject*, Runtime_UnwrapGlobalProxy) { | 13249 RUNTIME_FUNCTION(MaybeObject*, Runtime_UnwrapGlobalProxy) { |
| 13249 ASSERT(args.length() == 1); | 13250 ASSERT(args.length() == 1); |
| 13250 Object* object = args[0]; | 13251 Object* object = args[0]; |
| 13251 if (object->IsJSGlobalProxy()) { | 13252 if (object->IsJSGlobalProxy()) { |
| 13252 object = object->GetPrototype(); | 13253 object = object->GetPrototype(isolate); |
| 13253 if (object->IsNull()) return isolate->heap()->undefined_value(); | 13254 if (object->IsNull()) return isolate->heap()->undefined_value(); |
| 13254 } | 13255 } |
| 13255 return object; | 13256 return object; |
| 13256 } | 13257 } |
| 13257 | 13258 |
| 13258 | 13259 |
| 13259 // ---------------------------------------------------------------------------- | 13260 // ---------------------------------------------------------------------------- |
| 13260 // Implementation of Runtime | 13261 // Implementation of Runtime |
| 13261 | 13262 |
| 13262 #define F(name, number_of_args, result_size) \ | 13263 #define F(name, number_of_args, result_size) \ |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13335 // Handle last resort GC and make sure to allow future allocations | 13336 // Handle last resort GC and make sure to allow future allocations |
| 13336 // to grow the heap without causing GCs (if possible). | 13337 // to grow the heap without causing GCs (if possible). |
| 13337 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13338 isolate->counters()->gc_last_resort_from_js()->Increment(); |
| 13338 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 13339 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
| 13339 "Runtime::PerformGC"); | 13340 "Runtime::PerformGC"); |
| 13340 } | 13341 } |
| 13341 } | 13342 } |
| 13342 | 13343 |
| 13343 | 13344 |
| 13344 } } // namespace v8::internal | 13345 } } // namespace v8::internal |
| OLD | NEW |