Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(190)

Side by Side Diff: src/builtins.cc

Issue 2090353003: Amend DataView, ArrayBuffer, and TypedArray methods to use ToIndex. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: enable test Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/js/runtime.js » ('j') | src/js/typedarray.js » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/builtins.h" 5 #include "src/builtins.h"
6 6
7 #include "src/api-arguments.h" 7 #include "src/api-arguments.h"
8 #include "src/api-natives.h" 8 #include "src/api-natives.h"
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/base/ieee754.h" 10 #include "src/base/ieee754.h"
(...skipping 3066 matching lines...) Expand 10 before | Expand all | Expand 10 after
3077 3077
3078 // 2. If Type(buffer) is not Object, throw a TypeError exception. 3078 // 2. If Type(buffer) is not Object, throw a TypeError exception.
3079 // 3. If buffer does not have an [[ArrayBufferData]] internal slot, throw a 3079 // 3. If buffer does not have an [[ArrayBufferData]] internal slot, throw a
3080 // TypeError exception. 3080 // TypeError exception.
3081 if (!buffer->IsJSArrayBuffer()) { 3081 if (!buffer->IsJSArrayBuffer()) {
3082 THROW_NEW_ERROR_RETURN_FAILURE( 3082 THROW_NEW_ERROR_RETURN_FAILURE(
3083 isolate, NewTypeError(MessageTemplate::kDataViewNotArrayBuffer)); 3083 isolate, NewTypeError(MessageTemplate::kDataViewNotArrayBuffer));
3084 } 3084 }
3085 Handle<JSArrayBuffer> array_buffer = Handle<JSArrayBuffer>::cast(buffer); 3085 Handle<JSArrayBuffer> array_buffer = Handle<JSArrayBuffer>::cast(buffer);
3086 3086
3087 // 4. Let numberOffset be ? ToNumber(byteOffset). 3087 // 4. Let offset be ToIndex(byteOffset).
3088 Handle<Object> number_offset;
3089 if (byte_offset->IsUndefined(isolate)) {
3090 // We intentionally violate the specification at this point to allow
3091 // for new DataView(buffer) invocations to be equivalent to the full
3092 // new DataView(buffer, 0) invocation.
3093 number_offset = handle(Smi::FromInt(0), isolate);
3094 } else {
3095 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, number_offset,
3096 Object::ToNumber(byte_offset));
3097 }
3098
3099 // 5. Let offset be ToInteger(numberOffset).
3100 Handle<Object> offset; 3088 Handle<Object> offset;
3101 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, offset, 3089 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, offset,
3102 Object::ToInteger(isolate, number_offset)); 3090 Object::ToIndex(isolate, byte_offset));
3103 3091
3104 // 6. If numberOffset ≠ offset or offset < 0, throw a RangeError exception. 3092 // 5. If IsDetachedBuffer(buffer) is true, throw a TypeError exception.
3105 if (number_offset->Number() != offset->Number() || offset->Number() < 0.0) {
3106 THROW_NEW_ERROR_RETURN_FAILURE(
3107 isolate, NewRangeError(MessageTemplate::kInvalidDataViewOffset));
3108 }
3109
3110 // 7. If IsDetachedBuffer(buffer) is true, throw a TypeError exception.
3111 // We currently violate the specification at this point. 3093 // We currently violate the specification at this point.
3112 3094
3113 // 8. Let bufferByteLength be the value of buffer's [[ArrayBufferByteLength]] 3095 // 6. Let bufferByteLength be the value of buffer's [[ArrayBufferByteLength]]
3114 // internal slot. 3096 // internal slot.
3115 double const buffer_byte_length = array_buffer->byte_length()->Number(); 3097 double const buffer_byte_length = array_buffer->byte_length()->Number();
3116 3098
3117 // 9. If offset > bufferByteLength, throw a RangeError exception 3099 // 7. If offset > bufferByteLength, throw a RangeError exception
3118 if (offset->Number() > buffer_byte_length) { 3100 if (offset->Number() > buffer_byte_length) {
3119 THROW_NEW_ERROR_RETURN_FAILURE( 3101 THROW_NEW_ERROR_RETURN_FAILURE(
3120 isolate, NewRangeError(MessageTemplate::kInvalidDataViewOffset)); 3102 isolate, NewRangeError(MessageTemplate::kInvalidDataViewOffset));
3121 } 3103 }
3122 3104
3123 Handle<Object> view_byte_length; 3105 Handle<Object> view_byte_length;
3124 if (byte_length->IsUndefined(isolate)) { 3106 if (byte_length->IsUndefined(isolate)) {
3125 // 10. If byteLength is undefined, then 3107 // 8. If byteLength is undefined, then
3126 // a. Let viewByteLength be bufferByteLength - offset. 3108 // a. Let viewByteLength be bufferByteLength - offset.
3127 view_byte_length = 3109 view_byte_length =
3128 isolate->factory()->NewNumber(buffer_byte_length - offset->Number()); 3110 isolate->factory()->NewNumber(buffer_byte_length - offset->Number());
3129 } else { 3111 } else {
3130 // 11. Else, 3112 // 9. Else,
3131 // a. Let viewByteLength be ? ToLength(byteLength). 3113 // a. Let viewByteLength be ? ToIndex(byteLength).
3132 // b. If offset+viewByteLength > bufferByteLength, throw a RangeError 3114 // b. If offset+viewByteLength > bufferByteLength, throw a RangeError
3133 // exception 3115 // exception
3134 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 3116 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, view_byte_length,
3135 isolate, view_byte_length, Object::ToLength(isolate, byte_length)); 3117 Object::ToIndex(isolate, byte_length));
3136 if (offset->Number() + view_byte_length->Number() > buffer_byte_length) { 3118 if (offset->Number() + view_byte_length->Number() > buffer_byte_length) {
3137 THROW_NEW_ERROR_RETURN_FAILURE( 3119 THROW_NEW_ERROR_RETURN_FAILURE(
3138 isolate, NewRangeError(MessageTemplate::kInvalidDataViewLength)); 3120 isolate, NewRangeError(MessageTemplate::kInvalidDataViewLength));
3139 } 3121 }
3140 } 3122 }
3141 3123
3142 // 12. Let O be ? OrdinaryCreateFromConstructor(NewTarget, 3124 // 10. Let O be ? OrdinaryCreateFromConstructor(NewTarget,
3143 // "%DataViewPrototype%", «[[DataView]], [[ViewedArrayBuffer]], 3125 // "%DataViewPrototype%", «[[DataView]], [[ViewedArrayBuffer]],
3144 // [[ByteLength]], [[ByteOffset]]»). 3126 // [[ByteLength]], [[ByteOffset]]»).
3145 // 13. Set O's [[DataView]] internal slot to true. 3127 // 11. Set O's [[DataView]] internal slot to true.
3146 Handle<JSObject> result; 3128 Handle<JSObject> result;
3147 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, 3129 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
3148 JSObject::New(target, new_target)); 3130 JSObject::New(target, new_target));
3149 for (int i = 0; i < ArrayBufferView::kInternalFieldCount; ++i) { 3131 for (int i = 0; i < ArrayBufferView::kInternalFieldCount; ++i) {
3150 Handle<JSDataView>::cast(result)->SetInternalField(i, Smi::FromInt(0)); 3132 Handle<JSDataView>::cast(result)->SetInternalField(i, Smi::FromInt(0));
3151 } 3133 }
3152 3134
3153 // 14. Set O's [[ViewedArrayBuffer]] internal slot to buffer. 3135 // 12. Set O's [[ViewedArrayBuffer]] internal slot to buffer.
3154 Handle<JSDataView>::cast(result)->set_buffer(*array_buffer); 3136 Handle<JSDataView>::cast(result)->set_buffer(*array_buffer);
3155 3137
3156 // 15. Set O's [[ByteLength]] internal slot to viewByteLength. 3138 // 13. Set O's [[ByteLength]] internal slot to viewByteLength.
3157 Handle<JSDataView>::cast(result)->set_byte_length(*view_byte_length); 3139 Handle<JSDataView>::cast(result)->set_byte_length(*view_byte_length);
3158 3140
3159 // 16. Set O's [[ByteOffset]] internal slot to offset. 3141 // 14. Set O's [[ByteOffset]] internal slot to offset.
3160 Handle<JSDataView>::cast(result)->set_byte_offset(*offset); 3142 Handle<JSDataView>::cast(result)->set_byte_offset(*offset);
3161 3143
3162 // 17. Return O. 3144 // 15. Return O.
3163 return *result; 3145 return *result;
3164 } 3146 }
3165 3147
3166 // ES6 section 24.2.4.1 get DataView.prototype.buffer 3148 // ES6 section 24.2.4.1 get DataView.prototype.buffer
3167 BUILTIN(DataViewPrototypeGetBuffer) { 3149 BUILTIN(DataViewPrototypeGetBuffer) {
3168 HandleScope scope(isolate); 3150 HandleScope scope(isolate);
3169 CHECK_RECEIVER(JSDataView, data_view, "get DataView.prototype.buffer"); 3151 CHECK_RECEIVER(JSDataView, data_view, "get DataView.prototype.buffer");
3170 return data_view->buffer(); 3152 return data_view->buffer();
3171 } 3153 }
3172 3154
(...skipping 2967 matching lines...) Expand 10 before | Expand all | Expand 10 after
6140 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) 6122 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H)
6141 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) 6123 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A)
6142 #undef DEFINE_BUILTIN_ACCESSOR_C 6124 #undef DEFINE_BUILTIN_ACCESSOR_C
6143 #undef DEFINE_BUILTIN_ACCESSOR_A 6125 #undef DEFINE_BUILTIN_ACCESSOR_A
6144 #undef DEFINE_BUILTIN_ACCESSOR_T 6126 #undef DEFINE_BUILTIN_ACCESSOR_T
6145 #undef DEFINE_BUILTIN_ACCESSOR_S 6127 #undef DEFINE_BUILTIN_ACCESSOR_S
6146 #undef DEFINE_BUILTIN_ACCESSOR_H 6128 #undef DEFINE_BUILTIN_ACCESSOR_H
6147 6129
6148 } // namespace internal 6130 } // namespace internal
6149 } // namespace v8 6131 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/js/runtime.js » ('j') | src/js/typedarray.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698