mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-02 08:07:50 +00:00
Use a better Float64Array mock.
This commit is contained in:
@@ -47,24 +47,37 @@
|
||||
}());
|
||||
|
||||
function addBizarroMethods() {
|
||||
var funcProto = Function.prototype,
|
||||
objectProto = Object.prototype,
|
||||
stringProto = String.prototype;
|
||||
|
||||
var hasOwnProperty = objectProto.hasOwnProperty,
|
||||
fnToString = funcProto.toString,
|
||||
nativeString = fnToString.call(objectProto.toString),
|
||||
propertyIsEnumerable = objectProto.propertyIsEnumerable,
|
||||
reToString = /toString/g;
|
||||
|
||||
function constant(value) {
|
||||
return function() {
|
||||
return value;
|
||||
};
|
||||
}
|
||||
function createToString(funcName) {
|
||||
return constant(nativeString.replace(reToString, funcName));
|
||||
}
|
||||
// allow bypassing native checks
|
||||
setProperty(Function.prototype, 'toString', (function() {
|
||||
setProperty(funcProto, 'toString', (function() {
|
||||
function wrapper() {
|
||||
setProperty(funcProto, 'toString', fnToString);
|
||||
var result = hasOwnProperty.call(this, 'toString') ? this.toString() : fnToString.call(this);
|
||||
setProperty(funcProto, 'toString', wrapper);
|
||||
return result;
|
||||
}
|
||||
var funcProto = Function.prototype,
|
||||
fnToString = funcProto.toString,
|
||||
hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||
|
||||
setProperty(funcProto, '_toString', fnToString);
|
||||
return wrapper;
|
||||
}()));
|
||||
|
||||
// add extensions
|
||||
Function.prototype._method = function() {};
|
||||
funcProto._method = function() {};
|
||||
|
||||
// set bad shims
|
||||
setProperty(Array, '_isArray', Array.isArray);
|
||||
@@ -85,7 +98,7 @@
|
||||
setProperty(Object, '_keys', Object.keys);
|
||||
setProperty(Object, 'keys', function() {});
|
||||
|
||||
setProperty(Object.prototype, 'hasOwnProperty', (function() {
|
||||
setProperty(objectProto, 'hasOwnProperty', (function() {
|
||||
function wrapper(key) {
|
||||
if (key == '1' && this && typeof this == 'object' && this.length === 2 &&
|
||||
hasOwnProperty.call(this, 'callee') &&
|
||||
@@ -95,10 +108,6 @@
|
||||
}
|
||||
return hasOwnProperty.call(this, key);
|
||||
}
|
||||
var objectProto = Object.prototype,
|
||||
hasOwnProperty = objectProto.hasOwnProperty,
|
||||
propertyIsEnumerable = objectProto.propertyIsEnumerable;
|
||||
|
||||
setProperty(objectProto, '_hasOwnProperty', hasOwnProperty);
|
||||
return wrapper;
|
||||
}()));
|
||||
@@ -106,8 +115,8 @@
|
||||
setProperty(Number, '_isFinite', Number.isFinite);
|
||||
setProperty(Number, 'isFinite', function() {});
|
||||
|
||||
setProperty(String.prototype, '_contains', String.prototype.contains);
|
||||
setProperty(String.prototype, 'contains', String.prototype._contains ? function() {} : Boolean);
|
||||
setProperty(stringProto, '_contains', stringProto.contains);
|
||||
setProperty(stringProto, 'contains', stringProto._contains ? function() {} : Boolean);
|
||||
|
||||
setProperty(document, '_createDocumentFragment', document.createDocumentFragment);
|
||||
document.createDocumentFragment = function() {};
|
||||
@@ -129,21 +138,21 @@
|
||||
view.set(new Uint8Array(this));
|
||||
return newBuffer;
|
||||
}
|
||||
function constant(value) {
|
||||
return function() {
|
||||
return value;
|
||||
};
|
||||
}
|
||||
var reToString = /toString/g,
|
||||
nativeString = Function.prototype.toString.call(toString),
|
||||
bufferToString = constant(nativeString.replace(reToString, 'ArrayBuffer')),
|
||||
sliceToString = constant(nativeString.replace(reToString, 'slice'));
|
||||
|
||||
setProperty(ArrayBuffer, 'toString', bufferToString);
|
||||
setProperty(bufferSlice, 'toString', sliceToString);
|
||||
setProperty(ArrayBuffer, 'toString', createToString('ArrayBuffer'));
|
||||
setProperty(bufferSlice, 'toString', createToString('slice'));
|
||||
return ArrayBuffer;
|
||||
}(_ArrayBuffer));
|
||||
}
|
||||
if (!window.Float64Array && window.Uint8Array) {
|
||||
Float64Array = (function() {
|
||||
function Float64Array(buffer, byteOffset, length) {
|
||||
return new Uint8Array(buffer, byteOffset || 0, length || buffer.byteLength);
|
||||
}
|
||||
setProperty(Float64Array, 'BYTES_PER_ELEMENT', 8);
|
||||
setProperty(Float64Array, 'toString', createToString('Float64Array'));
|
||||
return Float64Array;
|
||||
}());
|
||||
}
|
||||
setProperty(window, 'WinRTError', Error);
|
||||
|
||||
setProperty(window, 'exports', window);
|
||||
@@ -152,6 +161,10 @@
|
||||
}
|
||||
|
||||
function removeBizarroMethods() {
|
||||
var funcProto = Function.prototype,
|
||||
objectProto = Object.prototype,
|
||||
stringProto = String.prototype;
|
||||
|
||||
if (Array._isArray) {
|
||||
setProperty(Array, 'isArray', Array._isArray);
|
||||
} else {
|
||||
@@ -187,13 +200,12 @@
|
||||
} else {
|
||||
delete Number.isFinite;
|
||||
}
|
||||
if (String.prototype._contains) {
|
||||
setProperty(String.prototype, 'contains', String.prototype._contains);
|
||||
if (stringProto._contains) {
|
||||
setProperty(stringProto, 'contains', stringProto._contains);
|
||||
} else {
|
||||
delete String.prototype.contains;
|
||||
delete stringProto.contains;
|
||||
}
|
||||
setProperty(Function.prototype, 'toString', Function.prototype._toString);
|
||||
setProperty(Object.prototype, 'hasOwnProperty', Object.prototype._hasOwnProperty);
|
||||
setProperty(objectProto, 'hasOwnProperty', objectProto._hasOwnProperty);
|
||||
|
||||
document.createDocumentFragment = document._createDocumentFragment;
|
||||
setProperty(document, '_createDocumentFragment', undefined);
|
||||
@@ -202,7 +214,6 @@
|
||||
ArrayBuffer = _ArrayBuffer;
|
||||
}
|
||||
setProperty(window, '_ArrayBuffer', undefined);
|
||||
|
||||
setProperty(window, 'WinRTError', undefined);
|
||||
|
||||
setProperty(window, 'exports', undefined);
|
||||
@@ -211,18 +222,13 @@
|
||||
|
||||
delete Array._isArray;
|
||||
delete Date._now;
|
||||
delete Function.prototype._method;
|
||||
delete Function.prototype._toString;
|
||||
delete funcProto._method;
|
||||
delete Object._create;
|
||||
delete Object._defineProperty;
|
||||
delete Object._getPrototypeOf;
|
||||
delete Object._keys;
|
||||
delete Object.prototype._hasOwnProperty;
|
||||
delete String.prototype._contains;
|
||||
}
|
||||
|
||||
if (!window.Float64Array && window.Uint8Array) {
|
||||
Float64Array = Uint8Array;
|
||||
delete objectProto._hasOwnProperty;
|
||||
delete stringProto._contains;
|
||||
}
|
||||
QUnit.config.hidepassed = true;
|
||||
|
||||
|
||||
33
test/test.js
33
test/test.js
@@ -328,6 +328,13 @@
|
||||
return;
|
||||
}
|
||||
}
|
||||
var fnToString = funcProto.toString,
|
||||
nativeString = fnToString.call(toString),
|
||||
reToString = /toString/g;
|
||||
|
||||
function createToString(funcName) {
|
||||
return _.constant(nativeString.replace(reToString, funcName));
|
||||
}
|
||||
// load ES6 Set shim
|
||||
require('./asset/set');
|
||||
|
||||
@@ -339,10 +346,9 @@
|
||||
_._baseEach = baseEach.baseEach || baseEach['default'] || baseEach;
|
||||
}
|
||||
// allow bypassing native checks
|
||||
var _fnToString = funcProto.toString;
|
||||
setProperty(funcProto, 'toString', function wrapper() {
|
||||
setProperty(funcProto, 'toString', _fnToString);
|
||||
var result = _.has(this, 'toString') ? this.toString() : _fnToString.call(this);
|
||||
setProperty(funcProto, 'toString', fnToString);
|
||||
var result = _.has(this, 'toString') ? this.toString() : fnToString.call(this);
|
||||
setProperty(funcProto, 'toString', wrapper);
|
||||
return result;
|
||||
});
|
||||
@@ -374,7 +380,7 @@
|
||||
if (key == '1' && _.isArguments(this) && _.isEqual(_.values(this), [0, 0])) {
|
||||
throw new Error;
|
||||
}
|
||||
return _hasOwnProperty.call(this, key);
|
||||
return _.has(this, key);
|
||||
});
|
||||
|
||||
var _isFinite = Number.isFinite;
|
||||
@@ -399,18 +405,20 @@
|
||||
view.set(new Uint8Array(this));
|
||||
return newBuffer;
|
||||
}
|
||||
var reToString = /toString/g,
|
||||
nativeString = _fnToString.call(toString),
|
||||
bufferToString = _.constant(nativeString.replace(reToString, 'ArrayBuffer')),
|
||||
sliceToString = _.constant(nativeString.replace(reToString, 'slice'));
|
||||
|
||||
setProperty(ArrayBuffer, 'toString', bufferToString);
|
||||
setProperty(bufferSlice, 'toString', sliceToString);
|
||||
setProperty(ArrayBuffer, 'toString', createToString('ArrayBuffer'));
|
||||
setProperty(bufferSlice, 'toString', createToString('slice'));
|
||||
return ArrayBuffer;
|
||||
}()));
|
||||
|
||||
if (!root.Float64Array) {
|
||||
setProperty(root, 'Float64Array', Uint8Array);
|
||||
setProperty(root, 'Float64Array', (function() {
|
||||
function Float64Array(buffer, byteOffset, length) {
|
||||
return new Uint8Array(buffer, byteOffset || 0, length || buffer.byteLength);
|
||||
}
|
||||
setProperty(Float64Array, 'BYTES_PER_ELEMENT', 8);
|
||||
setProperty(Float64Array, 'toString', createToString('Float64Array'));
|
||||
return Float64Array;
|
||||
}()));
|
||||
}
|
||||
// fake `WinRTError`
|
||||
setProperty(root, 'WinRTError', Error);
|
||||
@@ -437,7 +445,6 @@
|
||||
setProperty(Object, 'keys', _keys);
|
||||
|
||||
setProperty(objectProto, 'hasOwnProperty', _hasOwnProperty);
|
||||
setProperty(funcProto, 'toString', _fnToString);
|
||||
|
||||
if (_isFinite) {
|
||||
setProperty(Number, 'isFinite', _isFinite);
|
||||
|
||||
Reference in New Issue
Block a user