UNPKG

reign

Version:

A persistent, typed-objects implementation.

147 lines (124 loc) 4.8 kB
"use strict"; 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); }; }); };