JSArrayBufferPrototype.cpp [plain text]
#include "config.h"
#include "JSArrayBufferPrototype.h"
#include "Error.h"
#include "ExceptionHelpers.h"
#include "JSArrayBuffer.h"
#include "JSFunction.h"
#include "JSCInlines.h"
#include "TypedArrayAdaptors.h"
namespace JSC {
static EncodedJSValue JSC_HOST_CALL arrayBufferProtoFuncSlice(ExecState* exec)
{
JSFunction* callee = jsCast<JSFunction*>(exec->callee());
JSArrayBuffer* thisObject = jsDynamicCast<JSArrayBuffer*>(exec->thisValue());
if (!thisObject)
return throwVMError(exec, createTypeError(exec, "Receiver of slice must be an array buffer."));
if (!exec->argumentCount())
return throwVMError(exec, createTypeError(exec, "Slice requires at least one argument."));
int32_t begin = exec->argument(0).toInt32(exec);
if (exec->hadException())
return JSValue::encode(jsUndefined());
int32_t end;
if (exec->argumentCount() >= 2) {
end = exec->uncheckedArgument(1).toInt32(exec);
if (exec->hadException())
return JSValue::encode(jsUndefined());
} else
end = thisObject->impl()->byteLength();
RefPtr<ArrayBuffer> newBuffer = thisObject->impl()->slice(begin, end);
if (!newBuffer)
return throwVMError(exec, createOutOfMemoryError(callee->globalObject()));
Structure* structure = callee->globalObject()->arrayBufferStructure();
JSArrayBuffer* result = JSArrayBuffer::create(exec->vm(), structure, newBuffer);
return JSValue::encode(result);
}
const ClassInfo JSArrayBufferPrototype::s_info = {
"ArrayBufferPrototype", &Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSArrayBufferPrototype)
};
JSArrayBufferPrototype::JSArrayBufferPrototype(VM& vm, Structure* structure)
: Base(vm, structure)
{
}
void JSArrayBufferPrototype::finishCreation(VM& vm, JSGlobalObject* globalObject)
{
Base::finishCreation(vm);
JSC_NATIVE_FUNCTION(vm.propertyNames->slice, arrayBufferProtoFuncSlice, DontEnum, 2);
}
JSArrayBufferPrototype* JSArrayBufferPrototype::create(VM& vm, JSGlobalObject* globalObject, Structure* structure)
{
JSArrayBufferPrototype* prototype =
new (NotNull, allocateCell<JSArrayBufferPrototype>(vm.heap))
JSArrayBufferPrototype(vm, structure);
prototype->finishCreation(vm, globalObject);
return prototype;
}
Structure* JSArrayBufferPrototype::createStructure(
VM& vm, JSGlobalObject* globalObject, JSValue prototype)
{
return Structure::create(
vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
}
}