QScriptValue ScShiftFloatArrayProperty::add(QScriptContext *ctx, QScriptEngine *)
  {
  ScProfileFunction
  SProperty **thisProperty = getThis(ctx);
  SProperty **addAProperty = unpackValue(ctx->argument(0)); // returning script node as object

  SProperty **addBProperty = 0;
  if(ctx->argumentCount() > 1 )
    {
    addBProperty = unpackValue(ctx->argument(1)); // returning script node as object
    }

  if(addAProperty && thisProperty)
    {
    SFloatArrayProperty* addThis = (*thisProperty)->castTo<SFloatArrayProperty>();
    SFloatArrayProperty* addA = (*addAProperty)->castTo<SFloatArrayProperty>();
    SFloatArrayProperty* addB = (*addBProperty)->castTo<SFloatArrayProperty>();

    if(addThis && addA)
      {
      if(addB)
        {
        addThis->add(addA, addB);
        }
      else
        {
        addThis->add(addA);
        }
      }
    }
  return QScriptValue();
  }
QScriptValue ScShiftPropertyContainer::property(const QScriptValue &object, const QScriptString &name, uint id)
  {
  ScProfileFunction
  SPropertyContainer *prop = (*unpackValue(object))->uncheckedCastTo<SPropertyContainer>();
  if (!prop)
    {
    xAssertFail();
    return 0;
    }

  if(id != (uint)-1)
    {
    SProperty *c = prop->firstChild();
    while(c && id)
      {
      --id;
      c = c->nextSibling();
      }

    if(c)
      {
      return ScEmbeddedTypes::packValue(c);
      }
    }
  else
    {
    return ScEmbeddedTypes::packValue(prop->findChild(name));
    }
  return QScriptValue();
  }
QScriptClass::QueryFlags ScShiftPropertyContainer::queryProperty(const QScriptValue &object, const QScriptString &name, QueryFlags flags, uint *id)
  {
  ScProfileFunction
  SPropertyContainer *prop = (*unpackValue(object))->uncheckedCastTo<SPropertyContainer>();
  if (!prop)
    {
    xAssertFail();
    return 0;
    }

  *id = (uint)-1;
  bool isArrayIndex = false;
  qint32 pos = name.toArrayIndex(&isArrayIndex);
  if(isArrayIndex)
    {
    *id = pos;
    return flags;
    }
  else
    {
    SProperty *child = prop->findChild(name);
    if(child)
      {
      return flags;
      }
    }
  return 0;
  }
void
MetaAttribute::unpackAttribute(const ReadSection &rs, Allocator &allocator,
	uint32 &numValues, CSSM_DATA *&values) const
{
	uint32 valueOffset;
	unpackNumberOfValues(rs, numValues, valueOffset);
	
	// Rough check for number of values; will be more like 10 or 20
	if (numValues > 1024)
		CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);

	values = reinterpret_cast<CSSM_DATA *>(allocator.malloc(numValues * sizeof(CSSM_DATA)));
	
	for (uint32 i = 0; i < numValues; i++)
		unpackValue(rs, valueOffset, values[i], allocator);
}