/* +----------------------------------------------------------------------+ | HipHop for PHP | +----------------------------------------------------------------------+ | Copyright (c) 2010-2013 Facebook, Inc. (http://www.facebook.com) | | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.zend.com/license/2_00.txt. | | If you did not receive a copy of the Zend license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@zend.com so we can mail you a copy immediately. | +----------------------------------------------------------------------+ */ #include "hphp/runtime/base/list_assignment.h" #include "hphp/runtime/base/complex_types.h" namespace HPHP { /////////////////////////////////////////////////////////////////////////////// // ListAssignmentElement ListAssignmentElement::ListAssignmentElement(Variant &var, int index, ...) : m_var(var) { va_list ap; va_start(ap, index); while (index != -1) { m_indices.push_back(index); index = va_arg(ap, int); } va_end(ap); } void ListAssignmentElement::assign(CArrRef data) { assert(!m_indices.empty()); Variant tmp = data; unsigned int size = m_indices.size(); for (unsigned int i = 0; i < size; i++) { tmp = tmp.rvalAt(m_indices[i]); } m_var = tmp; } /////////////////////////////////////////////////////////////////////////////// // global function Variant list_assign(CVarRef data, ListAssignmentElement *elem, ...) { Array adata = data.toArray(); vector elems; va_list ap; va_start(ap, elem); while (elem) { elems.push_back(elem); elem = va_arg(ap, ListAssignmentElement *); } va_end(ap); for (int i = elems.size() - 1; i >= 0; i--) { elems[i]->assign(adata); delete elems[i]; } return data; } /////////////////////////////////////////////////////////////////////////////// }