Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / v8 / src / arraybuffer.js
1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 "use strict";
6
7 var $ArrayBuffer = global.ArrayBuffer;
8
9 // -------------------------------------------------------------------
10
11 function ArrayBufferConstructor(length) { // length = 1
12   if (%_IsConstructCall()) {
13     var byteLength = ToPositiveInteger(length, 'invalid_array_buffer_length');
14     %ArrayBufferInitialize(this, byteLength);
15   } else {
16     throw MakeTypeError('constructor_not_function', ["ArrayBuffer"]);
17   }
18 }
19
20 function ArrayBufferGetByteLen() {
21   if (!IS_ARRAYBUFFER(this)) {
22     throw MakeTypeError('incompatible_method_receiver',
23                         ['ArrayBuffer.prototype.byteLength', this]);
24   }
25   return %_ArrayBufferGetByteLength(this);
26 }
27
28 // ES6 Draft 15.13.5.5.3
29 function ArrayBufferSlice(start, end) {
30   if (!IS_ARRAYBUFFER(this)) {
31     throw MakeTypeError('incompatible_method_receiver',
32                         ['ArrayBuffer.prototype.slice', this]);
33   }
34
35   var relativeStart = TO_INTEGER(start);
36   if (!IS_UNDEFINED(end)) {
37     end = TO_INTEGER(end);
38   }
39   var first;
40   var byte_length = %_ArrayBufferGetByteLength(this);
41   if (relativeStart < 0) {
42     first = MathMax(byte_length + relativeStart, 0);
43   } else {
44     first = MathMin(relativeStart, byte_length);
45   }
46   var relativeEnd = IS_UNDEFINED(end) ? byte_length : end;
47   var fin;
48   if (relativeEnd < 0) {
49     fin = MathMax(byte_length + relativeEnd, 0);
50   } else {
51     fin = MathMin(relativeEnd, byte_length);
52   }
53
54   if (fin < first) {
55     fin = first;
56   }
57   var newLen = fin - first;
58   // TODO(dslomov): implement inheritance
59   var result = new $ArrayBuffer(newLen);
60
61   %ArrayBufferSliceImpl(this, result, first);
62   return result;
63 }
64
65 function ArrayBufferIsViewJS(obj) {
66   return %ArrayBufferIsView(obj);
67 }
68
69 function SetUpArrayBuffer() {
70   %CheckIsBootstrapping();
71
72   // Set up the ArrayBuffer constructor function.
73   %SetCode($ArrayBuffer, ArrayBufferConstructor);
74   %FunctionSetPrototype($ArrayBuffer, new $Object());
75
76   // Set up the constructor property on the ArrayBuffer prototype object.
77   %AddNamedProperty(
78       $ArrayBuffer.prototype, "constructor", $ArrayBuffer, DONT_ENUM);
79
80   InstallGetter($ArrayBuffer.prototype, "byteLength", ArrayBufferGetByteLen);
81
82   InstallFunctions($ArrayBuffer, DONT_ENUM, $Array(
83       "isView", ArrayBufferIsViewJS
84   ));
85
86   InstallFunctions($ArrayBuffer.prototype, DONT_ENUM, $Array(
87       "slice", ArrayBufferSlice
88   ));
89 }
90
91 SetUpArrayBuffer();