@powerlang/egg-js
Version:
A Smalltalk VM that runs on top of JavaScript
125 lines (100 loc) • 2.83 kB
JavaScript
import EggEvaluator from './EggEvaluator.js';
let EggIterativeInterpreter = class extends EggEvaluator {
constructor() {
super();
this._regR = nil;
}
evaluate() {
return this.subclassResponsibility();
}
hasFinished() {
return this._context.hasFinished();
}
initializeUndermessages() {
super.initializeUndermessages();
this._undermessages.at_put_("_restart", this.underprimitiveRestart());
return this;
}
prepareDispatch_(dispatch) {
this.subclassResponsibility();
return this;
}
prepareForBlock_(sblock) {
return this.subclassResponsibility();
}
regR_(anObject) {
this._regR = anObject;
return this;
}
unboundAssignment_with_(aBinding, assignees) {
if (assignees.size()._greaterThan(1))
{
this.error_("unbound name with multiple assignments not yet supported")
}
;
this.doesNotKnow_assigned_(aBinding.name(), this._regR);
return this;
}
underprimitiveRestart() {
return this.subclassResponsibility();
}
visitBlock_(anSBlock) {
this._regR = this._context.captureClosure_(anSBlock);
return this;
}
visitIdentifier_(anSIdentifier) {
let binding;
const _home = {};
try {
binding = anSIdentifier.binding();
this._regR = binding.valueWithin_ifUnbound_(this._context, () => {
throw [_home, this.doesNotKnow_(binding.name())]
});
return this;
} catch(e) { if (e[0] == _home) return e[1]; else throw(e); }
}
visitLiteral_(anSLiteral) {
this._regR = this._runtime.literalFor_(anSLiteral.value());
return this;
}
visitOpAssign_(anSOpAssign) {
let assignees, binding;
assignees = anSOpAssign.assignees();
assignees.do_((identifier) => {
binding = identifier.binding();
return binding.assign_within_ifUnbound_(this._regR, this._context, () => {
return this.unboundAssignment_with_(binding, assignees)
})
});
return this;
}
visitOpDropToS_(anSOpDropToS) {
this._context.dropOperands_(anSOpDropToS.count());
return this;
}
visitOpLoadRfromFrame_(anSOpLoadRfromFrame) {
this._regR = this._context.stackTemporaryAt_(anSOpLoadRfromFrame.index());
return this;
}
visitOpLoadRfromStack_(anSOpLoadRfromStack) {
this._regR = this._context.operandAt_(anSOpLoadRfromStack.index());
return this;
}
visitOpLoadRwithNil_(anSOpLoadRwithNil) {
this._regR = this._nilObj;
return this;
}
visitOpLoadRwithSelf_(anSOpLoadRwithSelf) {
this._regR = this._context.self();
return this;
}
visitOpPushR_(anSOpPushR) {
this._context.pushOperand_(this._regR);
return this;
}
visitOpStoreRintoFrame_(anSOpStoreRintoFrame) {
this._context.stackTemporaryAt_put_(anSOpStoreRintoFrame.index(), this._regR);
return this;
}
}
export default EggIterativeInterpreter