Commit 99133912 authored by dslomov@chromium.org's avatar dslomov@chromium.org

Generate DataViewInitialize built-in in hydrogen.

R=bmeurer@chromium.org, mvstanton@chromium.org

Review URL: https://codereview.chromium.org/66843011

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17831 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent c0b70209
......@@ -8052,6 +8052,52 @@ const HOptimizedGraphBuilder::InlineFunctionGenerator
#undef INLINE_FUNCTION_GENERATOR_ADDRESS
void HOptimizedGraphBuilder::VisitDataViewInitialize(
CallRuntime* expr) {
ZoneList<Expression*>* arguments = expr->arguments();
NoObservableSideEffectsScope scope(this);
ASSERT(arguments->length()== 4);
CHECK_ALIVE(VisitForValue(arguments->at(0)));
HValue* obj = Pop();
CHECK_ALIVE(VisitForValue(arguments->at(1)));
HValue* buffer = Pop();
CHECK_ALIVE(VisitForValue(arguments->at(2)));
HValue* byte_offset = Pop();
CHECK_ALIVE(VisitForValue(arguments->at(3)));
HValue* byte_length = Pop();
for (int offset = JSDataView::kSize;
offset < JSDataView::kSizeWithInternalFields;
offset += kPointerSize) {
Add<HStoreNamedField>(obj,
HObjectAccess::ForJSObjectOffset(offset),
Add<HConstant>(static_cast<int32_t>(0)));
}
Add<HStoreNamedField>(obj,
HObjectAccess::ForJSObjectOffset(JSDataView::kBufferOffset), buffer);
Add<HStoreNamedField>(obj,
HObjectAccess::ForJSObjectOffset(JSDataView::kByteOffsetOffset),
byte_offset);
Add<HStoreNamedField>(obj,
HObjectAccess::ForJSObjectOffset(JSDataView::kByteLengthOffset),
byte_length);
Add<HStoreNamedField>(obj,
HObjectAccess::ForJSObjectOffset(JSDataView::kWeakNextOffset),
Add<HLoadNamedField>(buffer,
HObjectAccess::ForJSObjectOffset(
JSArrayBuffer::kWeakFirstViewOffset)));
Add<HStoreNamedField>(buffer,
HObjectAccess::ForJSObjectOffset(JSArrayBuffer::kWeakFirstViewOffset),
obj);
}
void HOptimizedGraphBuilder::VisitCallRuntime(CallRuntime* expr) {
ASSERT(!HasStackOverflow());
ASSERT(current_block() != NULL);
......@@ -8062,6 +8108,11 @@ void HOptimizedGraphBuilder::VisitCallRuntime(CallRuntime* expr) {
const Runtime::Function* function = expr->function();
ASSERT(function != NULL);
if (function->function_id == Runtime::kDataViewInitialize) {
return VisitDataViewInitialize(expr);
}
if (function->intrinsic_type == Runtime::INLINE) {
ASSERT(expr->name()->length() > 0);
ASSERT(expr->name()->Get(0) == '_');
......
......@@ -2154,6 +2154,8 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
bool IsCallNewArrayInlineable(CallNew* expr);
void BuildInlinedCallNewArray(CallNew* expr);
void VisitDataViewInitialize(CallRuntime* expr);
class PropertyAccessInfo {
public:
PropertyAccessInfo(Isolate* isolate, Handle<Map> map, Handle<String> name)
......
......@@ -309,7 +309,7 @@ function DataViewConstructor(buffer, byteOffset, byteLength) { // length = 3
if (!IS_ARRAYBUFFER(buffer)) {
throw MakeTypeError('data_view_not_array_buffer', []);
}
var bufferByteLength = %ArrayBufferGetByteLength(buffer);
var bufferByteLength = buffer.byteLength;
var offset = IS_UNDEFINED(byteOffset) ?
0 : ToPositiveInteger(byteOffset, 'invalid_data_view_offset');
if (offset > bufferByteLength) {
......
......@@ -208,6 +208,7 @@ var knownProblems = {
"_GeneratorThrow": true,
// Only applicable to DataViews.
"DataViewInitialize": true,
"DataViewGetBuffer": true,
"DataViewGetByteLength": true,
"DataViewGetByteOffset": true
......
......@@ -209,6 +209,7 @@ var knownProblems = {
"_GeneratorThrow": true,
// Only applicable to DataViews.
"DataViewInitialize": true,
"DataViewGetBuffer": true,
"DataViewGetByteLength": true,
"DataViewGetByteOffset": true
......
......@@ -208,6 +208,7 @@ var knownProblems = {
"_GeneratorThrow": true,
// Only applicable to DataViews.
"DataViewInitialize":true,
"DataViewGetBuffer": true,
"DataViewGetByteLength": true,
"DataViewGetByteOffset": true
......
......@@ -208,6 +208,7 @@ var knownProblems = {
"_GeneratorThrow": true,
// Only applicable to DataViews.
"DataViewInitialize": true,
"DataViewGetBuffer": true,
"DataViewGetByteLength": true,
"DataViewGetByteOffset": true
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment