背景
作为一项大学项目,我们想要改变pharo虚拟机使用一个对象表,并观察其结果。
我们使用了从github克隆的pharo虚拟机和VMMaker。构建虚拟机很顺利。
为了开始,我们添加了一个返回递增整数的原语:
InterpreterPrimitives>>primitiveIntegerIncrement
"increments an integer"
self pushInteger: self popInteger + 1 .
并相应修改StackInterpreter类的initializePrimitiveTable方法
MaxPrimitiveIndex := 576.
"... and so on ..."
(575 primitiveFail)
(576 primitiveIntegerIncrement))
而且它有效。
问题
当我们对虚拟机进行更改时,我们希望在SmalltalkImage中先进行测试运行,这样我们就不需要编译并发现它没有起作用。
类似于:
StackInterpreter test: '1 inc'
如果原始组件出现错误或故障,我可以对其进行调试。当然,还需做更多工作,但我该如何实现呢?
我们尝试过的方法
category
VMMaker-InterpreterSimulation
classStackInterpreterSimulator
. Trying the code in the commentsDoIt ^ (StackInterpreterSimulator new openOn: Smalltalk imageName) test
errors:
displayForm := 'Display has not yet been installed' asDisplayText form.
the ByteString does not understand
asDisplayText
(CogVMSimulator new openOn: Smalltalk imageName) test (InterpreterSimulator new openOn: Smalltalk imageName) test
error:
PrimitiveFailed: primitive #basicNew: in Array class failed
我也找到了这个屏幕录制视频,但它只能使用gbd从外部调试VM:http://vimeo.com/22485382#
我们的项目托管在这里:http://smalltalkhub.com/#!/~kirstin/PharoObjectTable
当前状态
我们开始实现一个对象表。属性查找可以通过对象表进行。全面支持对象表,并且不使用直接指针非常棘手,因为到处都需要使用指针。因此,我们使用指向对象表的指针来标识何时应该通过OT进行查找。我们还发现了所有对象创建原语,并将新对象添加到表中。