| 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 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 // a variable of the specified type with the given name. If the | 91 // a variable of the specified type with the given name. If the |
| 92 // object is not a Number call IllegalOperation and return. | 92 // object is not a Number call IllegalOperation and return. |
| 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(JSObject* boilerplate) { | 101 NOIGNORE static Object* DeepCopyBoilerplate(JSObject* boilerplate) { |
| 102 StackLimitCheck check; | 102 StackLimitCheck check; |
| 103 if (check.HasOverflowed()) return Top::StackOverflow(); | 103 if (check.HasOverflowed()) return Top::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(); |
| (...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 973 if (index >= 0) { | 973 if (index >= 0) { |
| 974 // The variable or constant context slot should always be in | 974 // The variable or constant context slot should always be in |
| 975 // the function context or the arguments object. | 975 // the function context or the arguments object. |
| 976 if (holder->IsContext()) { | 976 if (holder->IsContext()) { |
| 977 ASSERT(holder.is_identical_to(context)); | 977 ASSERT(holder.is_identical_to(context)); |
| 978 if (((attributes & READ_ONLY) == 0) || | 978 if (((attributes & READ_ONLY) == 0) || |
| 979 context->get(index)->IsTheHole()) { | 979 context->get(index)->IsTheHole()) { |
| 980 context->set(index, *initial_value); | 980 context->set(index, *initial_value); |
| 981 } | 981 } |
| 982 } else { | 982 } else { |
| 983 Handle<JSObject>::cast(holder)->SetElement(index, *initial_value); | 983 // The holder is an arguments object. |
| 984 Handle<JSObject> arguments(Handle<JSObject>::cast(holder)); |
| 985 SetElement(arguments, index, initial_value); |
| 984 } | 986 } |
| 985 } else { | 987 } else { |
| 986 // Slow case: The property is not in the FixedArray part of the context. | 988 // Slow case: The property is not in the FixedArray part of the context. |
| 987 Handle<JSObject> context_ext = Handle<JSObject>::cast(holder); | 989 Handle<JSObject> context_ext = Handle<JSObject>::cast(holder); |
| 988 SetProperty(context_ext, name, initial_value, mode); | 990 SetProperty(context_ext, name, initial_value, mode); |
| 989 } | 991 } |
| 990 } | 992 } |
| 991 | 993 |
| 992 } else { | 994 } else { |
| 993 // The property is not in the function context. It needs to be | 995 // The property is not in the function context. It needs to be |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1231 // The holder cannot be the function context. If it is, there | 1233 // The holder cannot be the function context. If it is, there |
| 1232 // should have been a const redeclaration error when declaring | 1234 // should have been a const redeclaration error when declaring |
| 1233 // the const property. | 1235 // the const property. |
| 1234 ASSERT(!holder.is_identical_to(context)); | 1236 ASSERT(!holder.is_identical_to(context)); |
| 1235 if ((attributes & READ_ONLY) == 0) { | 1237 if ((attributes & READ_ONLY) == 0) { |
| 1236 Handle<Context>::cast(holder)->set(index, *value); | 1238 Handle<Context>::cast(holder)->set(index, *value); |
| 1237 } | 1239 } |
| 1238 } else { | 1240 } else { |
| 1239 // The holder is an arguments object. | 1241 // The holder is an arguments object. |
| 1240 ASSERT((attributes & READ_ONLY) == 0); | 1242 ASSERT((attributes & READ_ONLY) == 0); |
| 1241 Handle<JSObject>::cast(holder)->SetElement(index, *value); | 1243 Handle<JSObject> arguments(Handle<JSObject>::cast(holder)); |
| 1244 SetElement(arguments, index, value); |
| 1242 } | 1245 } |
| 1243 return *value; | 1246 return *value; |
| 1244 } | 1247 } |
| 1245 | 1248 |
| 1246 // The property could not be found, we introduce it in the global | 1249 // The property could not be found, we introduce it in the global |
| 1247 // context. | 1250 // context. |
| 1248 if (attributes == ABSENT) { | 1251 if (attributes == ABSENT) { |
| 1249 Handle<JSObject> global = Handle<JSObject>(Top::context()->global()); | 1252 Handle<JSObject> global = Handle<JSObject>(Top::context()->global()); |
| 1250 SetProperty(global, name, value, NONE); | 1253 SetProperty(global, name, value, NONE); |
| 1251 return *value; | 1254 return *value; |
| (...skipping 2846 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4098 LookupResult result; | 4101 LookupResult result; |
| 4099 obj->LocalLookupRealNamedProperty(name, &result); | 4102 obj->LocalLookupRealNamedProperty(name, &result); |
| 4100 | 4103 |
| 4101 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); | 4104 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); |
| 4102 // If an existing property is either FIELD, NORMAL or CONSTANT_FUNCTION | 4105 // If an existing property is either FIELD, NORMAL or CONSTANT_FUNCTION |
| 4103 // delete it to avoid running into trouble in DefineAccessor, which | 4106 // delete it to avoid running into trouble in DefineAccessor, which |
| 4104 // handles this incorrectly if the property is readonly (does nothing) | 4107 // handles this incorrectly if the property is readonly (does nothing) |
| 4105 if (result.IsProperty() && | 4108 if (result.IsProperty() && |
| 4106 (result.type() == FIELD || result.type() == NORMAL | 4109 (result.type() == FIELD || result.type() == NORMAL |
| 4107 || result.type() == CONSTANT_FUNCTION)) { | 4110 || result.type() == CONSTANT_FUNCTION)) { |
| 4108 obj->DeleteProperty(name, JSObject::NORMAL_DELETION); | 4111 Object* ok = obj->DeleteProperty(name, JSObject::NORMAL_DELETION); |
| 4112 if (ok->IsFailure()) return ok; |
| 4109 } | 4113 } |
| 4110 return obj->DefineAccessor(name, flag_setter->value() == 0, fun, attr); | 4114 return obj->DefineAccessor(name, flag_setter->value() == 0, fun, attr); |
| 4111 } | 4115 } |
| 4112 | 4116 |
| 4113 static Object* Runtime_DefineOrRedefineDataProperty(Arguments args) { | 4117 static Object* Runtime_DefineOrRedefineDataProperty(Arguments args) { |
| 4114 ASSERT(args.length() == 4); | 4118 ASSERT(args.length() == 4); |
| 4115 HandleScope scope; | 4119 HandleScope scope; |
| 4116 CONVERT_ARG_CHECKED(JSObject, js_object, 0); | 4120 CONVERT_ARG_CHECKED(JSObject, js_object, 0); |
| 4117 CONVERT_ARG_CHECKED(String, name, 1); | 4121 CONVERT_ARG_CHECKED(String, name, 1); |
| 4118 Handle<Object> obj_value = args.at<Object>(2); | 4122 Handle<Object> obj_value = args.at<Object>(2); |
| (...skipping 6620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10739 } else { | 10743 } else { |
| 10740 // Handle last resort GC and make sure to allow future allocations | 10744 // Handle last resort GC and make sure to allow future allocations |
| 10741 // to grow the heap without causing GCs (if possible). | 10745 // to grow the heap without causing GCs (if possible). |
| 10742 Counters::gc_last_resort_from_js.Increment(); | 10746 Counters::gc_last_resort_from_js.Increment(); |
| 10743 Heap::CollectAllGarbage(false); | 10747 Heap::CollectAllGarbage(false); |
| 10744 } | 10748 } |
| 10745 } | 10749 } |
| 10746 | 10750 |
| 10747 | 10751 |
| 10748 } } // namespace v8::internal | 10752 } } // namespace v8::internal |
| OLD | NEW |