UNPKG

@powerlang/egg-js

Version:

A Smalltalk VM that runs on top of JavaScript

125 lines (100 loc) 2.83 kB
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