Skip to content

Commit

Permalink
Implement void set(type[] array, optional unsigned long offset) and…
Browse files Browse the repository at this point in the history
… `TypedArray(ArrayBuffer buffer)`
  • Loading branch information
puffnfresh committed May 28, 2011
1 parent baeaf4d commit 54e7bda
Showing 1 changed file with 29 additions and 1 deletion.
30 changes: 29 additions & 1 deletion typed-array.cc
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -44,12 +44,38 @@ Handle<Value> ArrayBuffer(const Arguments& args) {
return args.This(); return args.This();
} }


Handle<Value> ArrayBufferViewSet(const Arguments& args) {
Local<Object> arrayBuffer = args.This()->GetHiddenValue(String::New("_buffer"))->ToObject();

if (args.Length() >= 1 && args[0]->IsArray()) {
Local<Array> source = Local<Array>::Cast(args[0]);
int offset = 0;

if(args.Length() >= 2 && args[1]->IsUint32()) {
offset = args[1]->Uint32Value();
}

int dataLength = args.This()->GetIndexedPropertiesExternalArrayDataLength();
if (offset + source->Length() > dataLength) {
return ThrowException(String::New("INDEX_SIZE_ERR: array too large"));
}

for (int index = 0; index < source->Length(); index++) {
args.This()->Set(offset + index, source->Get(index));
}
} else {
return ThrowException(String::New("Invalid ArrayBufferView::set arguments."));
}

return Undefined();
}

Handle<Value> CreateArrayBufferView(const Arguments& args, ExternalArrayType type, int element_size) { Handle<Value> CreateArrayBufferView(const Arguments& args, ExternalArrayType type, int element_size) {
Local<Object> arrayBuffer; Local<Object> arrayBuffer;
unsigned long elements = 0; unsigned long elements = 0;
unsigned long byteOffset = 0; unsigned long byteOffset = 0;


if (args.Length() == 1) { if (args.Length() == 1 && args[0]->IsUint32()) {
elements = args[0]->Uint32Value(); elements = args[0]->Uint32Value();
Local<Value> arg = Int32::New(elements * element_size); Local<Value> arg = Int32::New(elements * element_size);
arrayBuffer = array_buffer_constructor_template->GetFunction()->NewInstance(1, &arg); arrayBuffer = array_buffer_constructor_template->GetFunction()->NewInstance(1, &arg);
Expand Down Expand Up @@ -87,6 +113,8 @@ Handle<Value> CreateArrayBufferView(const Arguments& args, ExternalArrayType typ
args.This()->SetIndexedPropertiesToExternalArrayData(((int8_t*)arrayBufferData) + byteOffset, type, elements); args.This()->SetIndexedPropertiesToExternalArrayData(((int8_t*)arrayBufferData) + byteOffset, type, elements);
args.This()->Set(String::New("length"), Int32::New(elements), ReadOnly); args.This()->Set(String::New("length"), Int32::New(elements), ReadOnly);


args.This()->Set(String::New("set"), FunctionTemplate::New(ArrayBufferViewSet)->GetFunction());

return args.This(); return args.This();
} }


Expand Down

0 comments on commit 54e7bda

Please sign in to comment.