/*JSON{ "type" : "method", "class" : "ArrayBufferView", "name" : "set", "generate" : "jswrap_arraybufferview_set", "params" : [ ["arr","JsVar","Floating point index to access"], ["offset","int32","The offset in this array at which to write the values (optional)"] ] } Copy the contents of `array` into this one, mapping `this[x+offset]=array[x];` */ void jswrap_arraybufferview_set(JsVar *parent, JsVar *arr, int offset) { if (!(jsvIsString(arr) || jsvIsArray(arr) || jsvIsArrayBuffer(arr))) { jsExceptionHere(JSET_ERROR, "Expecting first argument to be an array, not %t", arr); return; } JsvIterator itsrc; jsvIteratorNew(&itsrc, arr); JsvArrayBufferIterator itdst; jsvArrayBufferIteratorNew(&itdst, parent, (size_t)offset); bool useInts = !JSV_ARRAYBUFFER_IS_FLOAT(itdst.type) || jsvIsString(arr); while (jsvIteratorHasElement(&itsrc) && jsvArrayBufferIteratorHasElement(&itdst)) { if (useInts) { jsvArrayBufferIteratorSetIntegerValue(&itdst, jsvIteratorGetIntegerValue(&itsrc)); } else { JsVar *value = jsvIteratorGetValue(&itsrc); jsvArrayBufferIteratorSetValue(&itdst, value); jsvUnLock(value); } jsvArrayBufferIteratorNext(&itdst); jsvIteratorNext(&itsrc); } jsvArrayBufferIteratorFree(&itdst); jsvIteratorFree(&itsrc); }
void jsvArrayBufferIteratorSetValue(JsvArrayBufferIterator *it, JsVar *value) { if (it->type == ARRAYBUFFERVIEW_UNDEFINED) return; assert(!it->hasAccessedElement); // we just haven't implemented this case yet char data[8]; int i,dataLen = (int)JSV_ARRAYBUFFER_GET_SIZE(it->type); if (JSV_ARRAYBUFFER_IS_FLOAT(it->type)) { jsvArrayBufferIteratorFloatToData(data, (unsigned)dataLen, it->type, jsvGetFloat(value)); } else { jsvArrayBufferIteratorIntToData(data, (unsigned)dataLen, it->type, jsvGetInteger(value)); } if (it->type & ARRAYBUFFERVIEW_BIG_ENDIAN) { for (i=dataLen-1;i>=0;i--) { jsvStringIteratorSetChar(&it->it, data[i]); if (dataLen!=1) jsvStringIteratorNext(&it->it); } } else { for (i=0;i<dataLen;i++) { jsvStringIteratorSetChar(&it->it, data[i]); if (dataLen!=1) jsvStringIteratorNext(&it->it); } } if (dataLen!=1) it->hasAccessedElement = true; }
void jsvArrayBufferIteratorSetValue(JsvArrayBufferIterator *it, JsVar *value) { if (it->type == ARRAYBUFFERVIEW_UNDEFINED) return; assert(!it->hasAccessedElement); // we just haven't implemented this case yet char data[8]; unsigned int i,dataLen = JSV_ARRAYBUFFER_GET_SIZE(it->type); if (JSV_ARRAYBUFFER_IS_FLOAT(it->type)) { JsVarFloat v = jsvGetFloat(value); ; if (dataLen==4) { float f = (float)v; memcpy(data,&f,dataLen); } else if (dataLen==8) { double f = (double)v; memcpy(data,&f,dataLen); } else assert(0); } else { JsVarInt v = jsvGetInteger(value); // we don't care about sign when writing - as it gets truncated if (dataLen==1) { char c = (char)v; memcpy(data,&c,dataLen); } else if (dataLen==2) { short c = (short)v; memcpy(data,&c,dataLen); } else if (dataLen==4) { int c = (int)v; memcpy(data,&c,dataLen); } else if (dataLen==8) { long long c = (long long)v; memcpy(data,&c,dataLen); } else assert(0); } for (i=0;i<dataLen;i++) { jsvStringIteratorSetChar(&it->it, data[i]); if (dataLen!=1) jsvStringIteratorNext(&it->it); } if (dataLen!=1) it->hasAccessedElement = true; }
JsVarFloat jsvArrayBufferIteratorGetFloatValue(JsvArrayBufferIterator *it) { if (it->type == ARRAYBUFFERVIEW_UNDEFINED) return 0; char data[8]; jsvArrayBufferIteratorGetValueData(it, data); if (JSV_ARRAYBUFFER_IS_FLOAT(it->type)) { return jsvArrayBufferIteratorDataToFloat(it, data); } else { return (JsVarFloat)jsvArrayBufferIteratorDataToInt(it, data); } }
JsVar *jsvArrayBufferIteratorGetValue(JsvArrayBufferIterator *it) { if (it->type == ARRAYBUFFERVIEW_UNDEFINED) return 0; char data[8]; jsvArrayBufferIteratorGetValueData(it, data); if (JSV_ARRAYBUFFER_IS_FLOAT(it->type)) { return jsvNewFromFloat(jsvArrayBufferIteratorDataToFloat(it, data)); } else { JsVarInt i = jsvArrayBufferIteratorDataToInt(it, data); if (it->type == ARRAYBUFFERVIEW_UINT32) return jsvNewFromLongInteger((long long)(uint32_t)i); return jsvNewFromInteger(i); } }
void jsvArrayBufferIteratorSetIntegerValue(JsvArrayBufferIterator *it, JsVarInt v) { if (it->type == ARRAYBUFFERVIEW_UNDEFINED) return; assert(!it->hasAccessedElement); // we just haven't implemented this case yet char data[8]; unsigned int i,dataLen = JSV_ARRAYBUFFER_GET_SIZE(it->type); if (JSV_ARRAYBUFFER_IS_FLOAT(it->type)) { jsvArrayBufferIteratorFloatToData(data, dataLen, it->type, (JsVarFloat)v); } else { jsvArrayBufferIteratorIntToData(data, dataLen, it->type, v); } for (i=0;i<dataLen;i++) { jsvStringIteratorSetChar(&it->it, data[i]); if (dataLen!=1) jsvStringIteratorNext(&it->it); } if (dataLen!=1) it->hasAccessedElement = true; }