michael@0: /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- michael@0: * vim: set ts=8 sts=4 et sw=4 tw=99: michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef vm_ArgumentsObject_inl_h michael@0: #define vm_ArgumentsObject_inl_h michael@0: michael@0: #include "vm/ArgumentsObject.h" michael@0: michael@0: #include "vm/ScopeObject.h" michael@0: michael@0: #include "jsscriptinlines.h" michael@0: michael@0: #include "vm/ScopeObject-inl.h" michael@0: michael@0: namespace js { michael@0: michael@0: inline const Value & michael@0: ArgumentsObject::element(uint32_t i) const michael@0: { michael@0: JS_ASSERT(!isElementDeleted(i)); michael@0: const Value &v = data()->args[i]; michael@0: if (v.isMagic()) { michael@0: CallObject &callobj = getFixedSlot(MAYBE_CALL_SLOT).toObject().as(); michael@0: return callobj.aliasedVarFromArguments(v); michael@0: } michael@0: return v; michael@0: } michael@0: michael@0: inline void michael@0: ArgumentsObject::setElement(JSContext *cx, uint32_t i, const Value &v) michael@0: { michael@0: JS_ASSERT(!isElementDeleted(i)); michael@0: HeapValue &lhs = data()->args[i]; michael@0: if (lhs.isMagic()) { michael@0: uint32_t slot = lhs.magicUint32(); michael@0: CallObject &callobj = getFixedSlot(MAYBE_CALL_SLOT).toObject().as(); michael@0: for (Shape::Range r(callobj.lastProperty()); !r.empty(); r.popFront()) { michael@0: if (r.front().slot() == slot) { michael@0: callobj.setAliasedVarFromArguments(cx, lhs, r.front().propid(), v); michael@0: return; michael@0: } michael@0: } michael@0: MOZ_ASSUME_UNREACHABLE("Bad Arguments::setElement"); michael@0: } michael@0: lhs = v; michael@0: } michael@0: michael@0: inline bool michael@0: ArgumentsObject::maybeGetElements(uint32_t start, uint32_t count, Value *vp) michael@0: { michael@0: JS_ASSERT(start + count >= start); michael@0: michael@0: uint32_t length = initialLength(); michael@0: if (start > length || start + count > length || isAnyElementDeleted()) michael@0: return false; michael@0: michael@0: for (uint32_t i = start, end = start + count; i < end; ++i, ++vp) michael@0: *vp = element(i); michael@0: return true; michael@0: } michael@0: michael@0: } /* namespace js */ michael@0: michael@0: #endif /* vm_ArgumentsObject_inl_h */