whalesong/js-assembler/runtime-src/baselib.js
2011-09-14 22:30:14 -04:00

77 lines
2.2 KiB
JavaScript

/*jslint vars: true, plusplus: true, maxerr: 50, indent: 4 */
// Basic library functions. This will include a few simple functions,
// but be augmented with several namespaces for the other libraries in
// the base library.
if (!(this.plt)) { this.plt = {}; }
(function (plt) {
'use strict';
var baselib = {};
plt.baselib = baselib;
// Simple object inheritance.
var heir = function (parentPrototype) {
var F = function () {};
F.prototype = parentPrototype;
return new F();
};
// clone: object -> object
// Copies an object. The new object should respond like the old
// object, including to things like instanceof.
var clone = function (obj) {
var property;
var C = function () {};
C.prototype = obj;
var c = new C();
for (property in obj) {
if (obj.hasOwnProperty(property)) {
c[property] = obj[property];
}
}
return c;
};
// Consumes a class and creates a predicate that recognizes subclasses.
var makeClassPredicate = function (aClass) {
return function (x) { return x instanceof aClass; };
};
// Helper to deal with the argument-passing of primitives. Call f
// with arguments bound from MACHINE.e, assuming
// MACHINE.a has been initialized with the number of
// arguments on the stack. vs provides optional values for the
// arguments that go beyond those of the mandatoryArgCount.
var withArguments = function (MACHINE, mandatoryArgCount, vs, f) {
var args = [], i;
for (i = 0; i < MACHINE.a; i++) {
if (i < mandatoryArgCount) {
args.push(MACHINE.e[MACHINE.e.length - 1 - i]);
} else {
if (i < MACHINE.a) {
args.push(MACHINE.e[MACHINE.e.length - 1 - i]);
} else {
args.push(vs[mandatoryArgCount - i]);
}
}
}
return f.apply(null, args);
};
baselib.heir = heir;
baselib.clone = clone;
baselib.makeClassPredicate = makeClassPredicate;
baselib.withArguments = withArguments;
}(this.plt));