X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/9bcd318d5fa2a38139c9651d263a06c797529333..ba379fdc102753d6be2c4d937058fe40257329fe:/runtime/ArgList.h diff --git a/runtime/ArgList.h b/runtime/ArgList.h index a1763e0..3c82561 100644 --- a/runtime/ArgList.h +++ b/runtime/ArgList.h @@ -1,6 +1,6 @@ /* * Copyright (C) 1999-2001 Harri Porten (porten@kde.org) - * Copyright (C) 2003, 2007, 2008 Apple Computer, Inc. + * Copyright (C) 2003, 2007, 2008, 2009 Apple Computer, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -22,7 +22,6 @@ #ifndef ArgList_h #define ArgList_h -#include "JSImmediate.h" #include "Register.h" #include @@ -31,11 +30,11 @@ namespace JSC { - class ArgList : Noncopyable { + class MarkedArgumentBuffer : Noncopyable { private: static const unsigned inlineCapacity = 8; typedef Vector VectorType; - typedef HashSet ListSet; + typedef HashSet ListSet; public: typedef VectorType::iterator iterator; @@ -43,8 +42,9 @@ namespace JSC { // Constructor for a read-write list, to which you may append values. // FIXME: Remove all clients of this API, then remove this API. - ArgList() - : m_markSet(0) + MarkedArgumentBuffer() + : m_isUsingInlineBuffer(true) + , m_markSet(0) #ifndef NDEBUG , m_isReadOnly(false) #endif @@ -54,9 +54,10 @@ namespace JSC { } // Constructor for a read-only list whose data has already been allocated elsewhere. - ArgList(Register* buffer, size_t size) + MarkedArgumentBuffer(Register* buffer, size_t size) : m_buffer(buffer) , m_size(size) + , m_isUsingInlineBuffer(true) , m_markSet(0) #ifndef NDEBUG , m_isReadOnly(true) @@ -76,7 +77,7 @@ namespace JSC { #endif } - ~ArgList() + ~MarkedArgumentBuffer() { if (m_markSet) m_markSet->remove(this); @@ -85,10 +86,10 @@ namespace JSC { size_t size() const { return m_size; } bool isEmpty() const { return !m_size; } - JSValuePtr at(ExecState* exec, size_t i) const + JSValue at(size_t i) const { if (i < m_size) - return m_buffer[i].jsValue(exec); + return m_buffer[i].jsValue(); return jsUndefined(); } @@ -99,11 +100,11 @@ namespace JSC { m_size = 0; } - void append(JSValuePtr v) + void append(JSValue v) { ASSERT(!m_isReadOnly); - if (m_size < inlineCapacity) { + if (m_isUsingInlineBuffer && m_size < inlineCapacity) { m_vector.uncheckedAppend(v); ++m_size; } else { @@ -111,11 +112,23 @@ namespace JSC { // the performance of the fast "just append to inline buffer" case. slowAppend(v); ++m_size; + m_isUsingInlineBuffer = false; } } - void getSlice(int startIndex, ArgList& result) const; + void removeLast() + { + ASSERT(m_size); + m_size--; + m_vector.removeLast(); + } + JSValue last() + { + ASSERT(m_size); + return m_buffer[m_size - 1].jsValue(); + } + iterator begin() { return m_buffer; } iterator end() { return m_buffer + m_size; } @@ -125,10 +138,11 @@ namespace JSC { static void markLists(ListSet&); private: - void slowAppend(JSValuePtr); + void slowAppend(JSValue); Register* m_buffer; size_t m_size; + bool m_isUsingInlineBuffer; VectorType m_vector; ListSet* m_markSet; @@ -156,6 +170,60 @@ namespace JSC { void operator delete(void*, size_t); }; + class ArgList { + friend class JIT; + public: + typedef JSValue* iterator; + typedef const JSValue* const_iterator; + + ArgList() + : m_args(0) + , m_argCount(0) + { + } + + ArgList(JSValue* args, unsigned argCount) + : m_args(args) + , m_argCount(argCount) + { + } + + ArgList(Register* args, int argCount) + : m_args(reinterpret_cast(args)) + , m_argCount(argCount) + { + ASSERT(argCount >= 0); + } + + ArgList(const MarkedArgumentBuffer& args) + : m_args(reinterpret_cast(const_cast(args.begin()))) + , m_argCount(args.size()) + { + } + + JSValue at(size_t idx) const + { + if (idx < m_argCount) + return m_args[idx]; + return jsUndefined(); + } + + bool isEmpty() const { return !m_argCount; } + + size_t size() const { return m_argCount; } + + iterator begin() { return m_args; } + iterator end() { return m_args + m_argCount; } + + const_iterator begin() const { return m_args; } + const_iterator end() const { return m_args + m_argCount; } + + void getSlice(int startIndex, ArgList& result) const; + private: + JSValue* m_args; + size_t m_argCount; + }; + } // namespace JSC #endif // ArgList_h