Use a better Float64Array mock.

This commit is contained in:
John-David Dalton
2014-07-22 09:16:09 -07:00
parent bdbc181e38
commit 14a99471f4
2 changed files with 66 additions and 53 deletions

View File

@@ -47,24 +47,37 @@
}()); }());
function addBizarroMethods() { 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 // allow bypassing native checks
setProperty(Function.prototype, 'toString', (function() { setProperty(funcProto, 'toString', (function() {
function wrapper() { function wrapper() {
setProperty(funcProto, 'toString', fnToString); setProperty(funcProto, 'toString', fnToString);
var result = hasOwnProperty.call(this, 'toString') ? this.toString() : fnToString.call(this); var result = hasOwnProperty.call(this, 'toString') ? this.toString() : fnToString.call(this);
setProperty(funcProto, 'toString', wrapper); setProperty(funcProto, 'toString', wrapper);
return result; return result;
} }
var funcProto = Function.prototype,
fnToString = funcProto.toString,
hasOwnProperty = Object.prototype.hasOwnProperty;
setProperty(funcProto, '_toString', fnToString);
return wrapper; return wrapper;
}())); }()));
// add extensions // add extensions
Function.prototype._method = function() {}; funcProto._method = function() {};
// set bad shims // set bad shims
setProperty(Array, '_isArray', Array.isArray); setProperty(Array, '_isArray', Array.isArray);
@@ -85,7 +98,7 @@
setProperty(Object, '_keys', Object.keys); setProperty(Object, '_keys', Object.keys);
setProperty(Object, 'keys', function() {}); setProperty(Object, 'keys', function() {});
setProperty(Object.prototype, 'hasOwnProperty', (function() { setProperty(objectProto, 'hasOwnProperty', (function() {
function wrapper(key) { function wrapper(key) {
if (key == '1' && this && typeof this == 'object' && this.length === 2 && if (key == '1' && this && typeof this == 'object' && this.length === 2 &&
hasOwnProperty.call(this, 'callee') && hasOwnProperty.call(this, 'callee') &&
@@ -95,10 +108,6 @@
} }
return hasOwnProperty.call(this, key); return hasOwnProperty.call(this, key);
} }
var objectProto = Object.prototype,
hasOwnProperty = objectProto.hasOwnProperty,
propertyIsEnumerable = objectProto.propertyIsEnumerable;
setProperty(objectProto, '_hasOwnProperty', hasOwnProperty); setProperty(objectProto, '_hasOwnProperty', hasOwnProperty);
return wrapper; return wrapper;
}())); }()));
@@ -106,8 +115,8 @@
setProperty(Number, '_isFinite', Number.isFinite); setProperty(Number, '_isFinite', Number.isFinite);
setProperty(Number, 'isFinite', function() {}); setProperty(Number, 'isFinite', function() {});
setProperty(String.prototype, '_contains', String.prototype.contains); setProperty(stringProto, '_contains', stringProto.contains);
setProperty(String.prototype, 'contains', String.prototype._contains ? function() {} : Boolean); setProperty(stringProto, 'contains', stringProto._contains ? function() {} : Boolean);
setProperty(document, '_createDocumentFragment', document.createDocumentFragment); setProperty(document, '_createDocumentFragment', document.createDocumentFragment);
document.createDocumentFragment = function() {}; document.createDocumentFragment = function() {};
@@ -129,21 +138,21 @@
view.set(new Uint8Array(this)); view.set(new Uint8Array(this));
return newBuffer; return newBuffer;
} }
function constant(value) { setProperty(ArrayBuffer, 'toString', createToString('ArrayBuffer'));
return function() { setProperty(bufferSlice, 'toString', createToString('slice'));
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);
return ArrayBuffer; return ArrayBuffer;
}(_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, 'WinRTError', Error);
setProperty(window, 'exports', window); setProperty(window, 'exports', window);
@@ -152,6 +161,10 @@
} }
function removeBizarroMethods() { function removeBizarroMethods() {
var funcProto = Function.prototype,
objectProto = Object.prototype,
stringProto = String.prototype;
if (Array._isArray) { if (Array._isArray) {
setProperty(Array, 'isArray', Array._isArray); setProperty(Array, 'isArray', Array._isArray);
} else { } else {
@@ -187,13 +200,12 @@
} else { } else {
delete Number.isFinite; delete Number.isFinite;
} }
if (String.prototype._contains) { if (stringProto._contains) {
setProperty(String.prototype, 'contains', String.prototype._contains); setProperty(stringProto, 'contains', stringProto._contains);
} else { } else {
delete String.prototype.contains; delete stringProto.contains;
} }
setProperty(Function.prototype, 'toString', Function.prototype._toString); setProperty(objectProto, 'hasOwnProperty', objectProto._hasOwnProperty);
setProperty(Object.prototype, 'hasOwnProperty', Object.prototype._hasOwnProperty);
document.createDocumentFragment = document._createDocumentFragment; document.createDocumentFragment = document._createDocumentFragment;
setProperty(document, '_createDocumentFragment', undefined); setProperty(document, '_createDocumentFragment', undefined);
@@ -202,7 +214,6 @@
ArrayBuffer = _ArrayBuffer; ArrayBuffer = _ArrayBuffer;
} }
setProperty(window, '_ArrayBuffer', undefined); setProperty(window, '_ArrayBuffer', undefined);
setProperty(window, 'WinRTError', undefined); setProperty(window, 'WinRTError', undefined);
setProperty(window, 'exports', undefined); setProperty(window, 'exports', undefined);
@@ -211,18 +222,13 @@
delete Array._isArray; delete Array._isArray;
delete Date._now; delete Date._now;
delete Function.prototype._method; delete funcProto._method;
delete Function.prototype._toString;
delete Object._create; delete Object._create;
delete Object._defineProperty; delete Object._defineProperty;
delete Object._getPrototypeOf; delete Object._getPrototypeOf;
delete Object._keys; delete Object._keys;
delete Object.prototype._hasOwnProperty; delete objectProto._hasOwnProperty;
delete String.prototype._contains; delete stringProto._contains;
}
if (!window.Float64Array && window.Uint8Array) {
Float64Array = Uint8Array;
} }
QUnit.config.hidepassed = true; QUnit.config.hidepassed = true;

View File

@@ -328,6 +328,13 @@
return; 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 // load ES6 Set shim
require('./asset/set'); require('./asset/set');
@@ -339,10 +346,9 @@
_._baseEach = baseEach.baseEach || baseEach['default'] || baseEach; _._baseEach = baseEach.baseEach || baseEach['default'] || baseEach;
} }
// allow bypassing native checks // allow bypassing native checks
var _fnToString = funcProto.toString;
setProperty(funcProto, 'toString', function wrapper() { setProperty(funcProto, 'toString', function wrapper() {
setProperty(funcProto, 'toString', _fnToString); setProperty(funcProto, 'toString', fnToString);
var result = _.has(this, 'toString') ? this.toString() : _fnToString.call(this); var result = _.has(this, 'toString') ? this.toString() : fnToString.call(this);
setProperty(funcProto, 'toString', wrapper); setProperty(funcProto, 'toString', wrapper);
return result; return result;
}); });
@@ -374,7 +380,7 @@
if (key == '1' && _.isArguments(this) && _.isEqual(_.values(this), [0, 0])) { if (key == '1' && _.isArguments(this) && _.isEqual(_.values(this), [0, 0])) {
throw new Error; throw new Error;
} }
return _hasOwnProperty.call(this, key); return _.has(this, key);
}); });
var _isFinite = Number.isFinite; var _isFinite = Number.isFinite;
@@ -399,18 +405,20 @@
view.set(new Uint8Array(this)); view.set(new Uint8Array(this));
return newBuffer; return newBuffer;
} }
var reToString = /toString/g, setProperty(ArrayBuffer, 'toString', createToString('ArrayBuffer'));
nativeString = _fnToString.call(toString), setProperty(bufferSlice, 'toString', createToString('slice'));
bufferToString = _.constant(nativeString.replace(reToString, 'ArrayBuffer')),
sliceToString = _.constant(nativeString.replace(reToString, 'slice'));
setProperty(ArrayBuffer, 'toString', bufferToString);
setProperty(bufferSlice, 'toString', sliceToString);
return ArrayBuffer; return ArrayBuffer;
}())); }()));
if (!root.Float64Array) { 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` // fake `WinRTError`
setProperty(root, 'WinRTError', Error); setProperty(root, 'WinRTError', Error);
@@ -437,7 +445,6 @@
setProperty(Object, 'keys', _keys); setProperty(Object, 'keys', _keys);
setProperty(objectProto, 'hasOwnProperty', _hasOwnProperty); setProperty(objectProto, 'hasOwnProperty', _hasOwnProperty);
setProperty(funcProto, 'toString', _fnToString);
if (_isFinite) { if (_isFinite) {
setProperty(Number, 'isFinite', _isFinite); setProperty(Number, 'isFinite', _isFinite);