41ef63df21
With bytecode flushing and lazy feedback allocation, we need to call %PrepareForOptimization before we call %OptimizeFunctionOnNextCall Bug: v8:8801, v8:8394 Change-Id: I81918f174b2f97cbaa8b8ef2e459080c2581f535 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1588415 Commit-Queue: Mythri Alle <mythria@chromium.org> Commit-Queue: Ross McIlroy <rmcilroy@chromium.org> Reviewed-by: Ross McIlroy <rmcilroy@chromium.org> Cr-Commit-Position: refs/heads/master@{#61122}
314 lines
6.3 KiB
JavaScript
314 lines
6.3 KiB
JavaScript
// Copyright 2014 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Flags: --allow-natives-syntax
|
|
|
|
|
|
(function TestBasics() {
|
|
var object = {
|
|
method() {
|
|
return 42;
|
|
}
|
|
};
|
|
assertEquals(42, object.method());
|
|
})();
|
|
|
|
|
|
(function TestThis() {
|
|
var object = {
|
|
method() {
|
|
assertEquals(object, this);
|
|
}
|
|
};
|
|
object.method();
|
|
})();
|
|
|
|
|
|
(function TestDescriptor() {
|
|
var object = {
|
|
method() {
|
|
return 42;
|
|
}
|
|
};
|
|
|
|
var desc = Object.getOwnPropertyDescriptor(object, 'method');
|
|
assertTrue(desc.enumerable);
|
|
assertTrue(desc.configurable);
|
|
assertTrue(desc.writable);
|
|
assertEquals('function', typeof desc.value);
|
|
|
|
assertEquals(42, desc.value());
|
|
})();
|
|
|
|
|
|
(function TestProto() {
|
|
var object = {
|
|
method() {}
|
|
};
|
|
|
|
assertEquals(Function.prototype, Object.getPrototypeOf(object.method));
|
|
})();
|
|
|
|
|
|
(function TestNotConstructable() {
|
|
var object = {
|
|
method() {}
|
|
};
|
|
|
|
assertThrows(function() {
|
|
new object.method;
|
|
});
|
|
})();
|
|
|
|
|
|
(function TestFunctionName() {
|
|
var object = {
|
|
method() {},
|
|
1() {},
|
|
2.0() {}
|
|
};
|
|
var f = object.method;
|
|
assertEquals('method', f.name);
|
|
var g = object[1];
|
|
assertEquals('1', g.name);
|
|
var h = object[2];
|
|
assertEquals('2', h.name);
|
|
})();
|
|
|
|
|
|
(function TestNoBinding() {
|
|
var method = 'local';
|
|
var calls = 0;
|
|
var object = {
|
|
method() {
|
|
calls++;
|
|
assertEquals('local', method);
|
|
}
|
|
};
|
|
object.method();
|
|
assertEquals(1, calls);
|
|
})();
|
|
|
|
|
|
(function TestNoPrototype() {
|
|
var object = {
|
|
method() {}
|
|
};
|
|
var f = object.method;
|
|
assertFalse(f.hasOwnProperty('prototype'));
|
|
assertEquals(undefined, f.prototype);
|
|
|
|
f.prototype = 42;
|
|
assertEquals(42, f.prototype);
|
|
})();
|
|
|
|
|
|
(function TestNoRestrictedPropertiesStrict() {
|
|
var obj = {
|
|
method() { "use strict"; }
|
|
};
|
|
assertFalse(obj.method.hasOwnProperty("arguments"));
|
|
assertThrows(function() { return obj.method.arguments; }, TypeError);
|
|
assertThrows(function() { obj.method.arguments = {}; }, TypeError);
|
|
|
|
assertFalse(obj.method.hasOwnProperty("caller"));
|
|
assertThrows(function() { return obj.method.caller; }, TypeError);
|
|
assertThrows(function() { obj.method.caller = {}; }, TypeError);
|
|
})();
|
|
|
|
|
|
(function TestNoRestrictedPropertiesSloppy() {
|
|
var obj = {
|
|
method() {}
|
|
};
|
|
assertFalse(obj.method.hasOwnProperty("arguments"));
|
|
assertThrows(function() { return obj.method.arguments; }, TypeError);
|
|
assertThrows(function() { obj.method.arguments = {}; }, TypeError);
|
|
|
|
assertFalse(obj.method.hasOwnProperty("caller"));
|
|
assertThrows(function() { return obj.method.caller; }, TypeError);
|
|
assertThrows(function() { obj.method.caller = {}; }, TypeError);
|
|
})();
|
|
|
|
|
|
(function TestToString() {
|
|
var object = {
|
|
method() { 42; }
|
|
};
|
|
assertEquals('method() { 42; }', object.method.toString());
|
|
})();
|
|
|
|
|
|
(function TestOptimized() {
|
|
var object = {
|
|
method() { return 42; }
|
|
};
|
|
%PrepareFunctionForOptimization(object.method);
|
|
assertEquals(42, object.method());
|
|
assertEquals(42, object.method());
|
|
%OptimizeFunctionOnNextCall(object.method);
|
|
assertEquals(42, object.method());
|
|
assertFalse(object.method.hasOwnProperty('prototype'));
|
|
})();
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
var GeneratorFunction = function*() {}.__proto__.constructor;
|
|
var GeneratorPrototype = Object.getPrototypeOf(function*() {}).prototype;
|
|
|
|
|
|
function assertIteratorResult(value, done, result) {
|
|
assertEquals({value: value, done: done}, result);
|
|
}
|
|
|
|
|
|
(function TestGeneratorBasics() {
|
|
var object = {
|
|
*method() {
|
|
yield 1;
|
|
}
|
|
};
|
|
var g = object.method();
|
|
assertIteratorResult(1, false, g.next());
|
|
assertIteratorResult(undefined, true, g.next());
|
|
})();
|
|
|
|
|
|
(function TestGeneratorThis() {
|
|
var object = {
|
|
*method() {
|
|
yield this;
|
|
}
|
|
};
|
|
var g = object.method();
|
|
assertIteratorResult(object, false, g.next());
|
|
assertIteratorResult(undefined, true, g.next());
|
|
})();
|
|
|
|
|
|
(function TestGeneratorSymbolIterator() {
|
|
var object = {
|
|
*method() {}
|
|
};
|
|
var g = object.method();
|
|
assertEquals(g, g[Symbol.iterator]());
|
|
})();
|
|
|
|
|
|
(function TestGeneratorDescriptor() {
|
|
var object = {
|
|
*method() {
|
|
yield 1;
|
|
}
|
|
};
|
|
|
|
var desc = Object.getOwnPropertyDescriptor(object, 'method');
|
|
assertTrue(desc.enumerable);
|
|
assertTrue(desc.configurable);
|
|
assertTrue(desc.writable);
|
|
assertEquals('function', typeof desc.value);
|
|
|
|
var g = desc.value();
|
|
assertIteratorResult(1, false, g.next());
|
|
assertIteratorResult(undefined, true, g.next());
|
|
})();
|
|
|
|
|
|
(function TestGeneratorPrototypeDescriptor() {
|
|
var object = {
|
|
*method() {}
|
|
};
|
|
|
|
var desc = Object.getOwnPropertyDescriptor(object.method, 'prototype');
|
|
assertFalse(desc.enumerable);
|
|
assertFalse(desc.configurable);
|
|
assertTrue(desc.writable);
|
|
assertEquals(GeneratorPrototype, Object.getPrototypeOf(desc.value));
|
|
})();
|
|
|
|
|
|
(function TestGeneratorProto() {
|
|
var object = {
|
|
*method() {}
|
|
};
|
|
|
|
assertEquals(GeneratorFunction.prototype,
|
|
Object.getPrototypeOf(object.method));
|
|
})();
|
|
|
|
|
|
(function TestGeneratorNotConstructable() {
|
|
var object = {
|
|
*method() {
|
|
yield 1;
|
|
}
|
|
};
|
|
|
|
assertThrows(()=>new object.method());
|
|
})();
|
|
|
|
|
|
(function TestGeneratorName() {
|
|
var object = {
|
|
*method() {},
|
|
*1() {},
|
|
*2.0() {}
|
|
};
|
|
var f = object.method;
|
|
assertEquals('method', f.name);
|
|
var g = object[1];
|
|
assertEquals('1', g.name);
|
|
var h = object[2];
|
|
assertEquals('2', h.name);
|
|
})();
|
|
|
|
|
|
(function TestGeneratorNoBinding() {
|
|
var method = 'local';
|
|
var calls = 0;
|
|
var object = {
|
|
*method() {
|
|
calls++;
|
|
assertEquals('local', method);
|
|
}
|
|
};
|
|
var g = object.method();
|
|
assertIteratorResult(undefined, true, g.next());
|
|
assertEquals(1, calls);
|
|
})();
|
|
|
|
|
|
(function TestGeneratorToString() {
|
|
var object = {
|
|
*method() { yield 1; }
|
|
};
|
|
assertEquals('*method() { yield 1; }', object.method.toString());
|
|
})();
|
|
|
|
|
|
(function TestProtoName() {
|
|
var object = {
|
|
__proto__() {
|
|
return 1;
|
|
}
|
|
};
|
|
assertEquals(Object.prototype, Object.getPrototypeOf(object));
|
|
assertEquals(1, object.__proto__());
|
|
})();
|
|
|
|
|
|
(function TestProtoName2() {
|
|
var p = {};
|
|
var object = {
|
|
__proto__() {
|
|
return 1;
|
|
},
|
|
__proto__: p
|
|
};
|
|
assertEquals(p, Object.getPrototypeOf(object));
|
|
assertEquals(1, object.__proto__());
|
|
})();
|