reign
Version:
A persistent, typed-objects implementation.
147 lines (124 loc) • 4.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Primitive = exports.MIN_TYPE_ID = undefined;
exports.make = make;
var _backing = require("backing");
var _backing2 = _interopRequireDefault(_backing);
var _ = require("../");
var _2 = require("../../");
var _symbols = require("../../symbols");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var MIN_TYPE_ID = exports.MIN_TYPE_ID = 1;
var Primitive = exports.Primitive = function (_TypedObject) {
_inherits(Primitive, _TypedObject);
function Primitive() {
_classCallCheck(this, Primitive);
return _possibleConstructorReturn(this, Object.getPrototypeOf(Primitive).apply(this, arguments));
}
return Primitive;
}(_.TypedObject);
/**
* Makes a PrimitiveType type class for a given realm.
*/
function make(realm) {
var TypeClass = realm.TypeClass;
var backing = realm.backing;
var typeCounter = 0;
return new TypeClass('PrimitiveType', function (config) {
return function (primitive) {
typeCounter++;
var name = config.name || "%Primitive<0x" + typeCounter.toString(16) + ">";
var id = config.id || MIN_TYPE_ID + typeCounter;
// Issue 252
primitive[_symbols.$CanBeEmbedded] = true;
// Issue 252
primitive[_symbols.$CanBeReferenced] = false;
// Issue 252
primitive[_symbols.$CanContainReferences] = false;
var PrimitiveArray = void 0;
// Issue 285
Object.defineProperties(primitive, {
Array: {
get: function get() {
if (PrimitiveArray === undefined) {
PrimitiveArray = new realm.ArrayType(primitive);
}
return PrimitiveArray;
}
}
});
return Object.assign({
name: name,
id: id,
gc: false,
accepts: function accepts(input) {
return false;
},
cast: function cast(input) {
return input;
},
initialize: function initialize(backing, address, initialValue) {
primitive.store(backing, address, initialValue);
},
clear: function clear(backing, address) {
primitive.store(backing, address, primitive.emptyValue());
},
destructor: function destructor() {
// no-op
},
constructor: function constructor(input, address) {
if (this instanceof Primitive) {
throw new TypeError(name + " is not a constructor.");
}
return primitive.cast(input);
},
prototype: Primitive.prototype,
equal: function equal(valueA, valueB) {
return valueA === valueB;
},
compareValues: function compareValues(valueA, valueB) {
if (valueA === valueB) {
return 0;
} else if (valueA > valueB) {
return 1;
} else {
return -1;
}
},
compareAddresses: function compareAddresses(backing, addressA, addressB) {
if (addressA === addressB) {
return 0;
} else if (addressA === 0) {
return -1;
} else if (addressB === 0) {
return 1;
}
var valueA = primitive.load(backing, addressA);
var valueB = primitive.load(backing, addressB);
if (valueA === valueB) {
return 0;
} else if (valueA > valueB) {
return 1;
} else {
return -1;
}
},
compareAddressValue: function compareAddressValue(backing, address, value) {
var loaded = primitive.load(backing, address);
if (loaded === value) {
return 0;
} else if (loaded > value) {
return 1;
} else {
return -1;
}
}
}, config);
};
});
};