1 // Copyright 2017 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_OBJECTS_ARGUMENTS_INL_H_ 6 #define V8_OBJECTS_ARGUMENTS_INL_H_ 7 8 #include "src/objects/arguments.h" 9 10 #include "src/contexts-inl.h" 11 #include "src/isolate-inl.h" 12 #include "src/objects-inl.h" 13 #include "src/objects/fixed-array-inl.h" 14 15 // Has to be the last include (doesn't have include guards): 16 #include "src/objects/object-macros.h" 17 18 namespace v8 { 19 namespace internal { 20 21 CAST_ACCESSOR(AliasedArgumentsEntry) 22 CAST_ACCESSOR(JSArgumentsObject) 23 CAST_ACCESSOR(SloppyArgumentsElements) 24 25 SMI_ACCESSORS(AliasedArgumentsEntry, aliased_context_slot, kAliasedContextSlot) 26 27 Context* SloppyArgumentsElements::context() { 28 return Context::cast(get(kContextIndex)); 29 } 30 31 FixedArray* SloppyArgumentsElements::arguments() { 32 return FixedArray::cast(get(kArgumentsIndex)); 33 } 34 35 void SloppyArgumentsElements::set_arguments(FixedArray* arguments) { 36 set(kArgumentsIndex, arguments); 37 } 38 39 uint32_t SloppyArgumentsElements::parameter_map_length() { 40 return length() - kParameterMapStart; 41 } 42 43 Object* SloppyArgumentsElements::get_mapped_entry(uint32_t entry) { 44 return get(entry + kParameterMapStart); 45 } 46 47 void SloppyArgumentsElements::set_mapped_entry(uint32_t entry, Object* object) { 48 set(entry + kParameterMapStart, object); 49 } 50 51 // TODO(danno): This shouldn't be inline here, but to defensively avoid 52 // regressions associated with the fix for the bug 778574, it's staying that way 53 // until the splice implementation in builtin-arrays.cc can be removed and this 54 // function can be moved into runtime-arrays.cc near its other usage. 55 bool JSSloppyArgumentsObject::GetSloppyArgumentsLength(Isolate* isolate, 56 Handle<JSObject> object, 57 int* out) { 58 Context* context = *isolate->native_context(); 59 Map* map = object->map(); 60 if (map != context->sloppy_arguments_map() && 61 map != context->strict_arguments_map() && 62 map != context->fast_aliased_arguments_map()) { 63 return false; 64 } 65 DCHECK(object->HasFastElements() || object->HasFastArgumentsElements()); 66 Object* len_obj = object->InObjectPropertyAt(JSArgumentsObject::kLengthIndex); 67 if (!len_obj->IsSmi()) return false; 68 *out = Max(0, Smi::ToInt(len_obj)); 69 70 FixedArray* parameters = FixedArray::cast(object->elements()); 71 if (object->HasSloppyArgumentsElements()) { 72 FixedArray* arguments = FixedArray::cast(parameters->get(1)); 73 return *out <= arguments->length(); 74 } 75 return *out <= parameters->length(); 76 } 77 78 } // namespace internal 79 } // namespace v8 80 81 #include "src/objects/object-macros-undef.h" 82 83 #endif // V8_OBJECTS_ARGUMENTS_INL_H_ 84