mirror of
https://github.com/CPunch/Cosmo.git
synced 2024-11-05 08:10:05 +00:00
added vm.disassemble()
This commit is contained in:
parent
5169aca6d0
commit
7f7bc7c6ad
@ -3,6 +3,7 @@
|
|||||||
#include "cmem.h"
|
#include "cmem.h"
|
||||||
#include "cobj.h"
|
#include "cobj.h"
|
||||||
#include "cvalue.h"
|
#include "cvalue.h"
|
||||||
|
#include "cdebug.h"
|
||||||
#include "cvm.h"
|
#include "cvm.h"
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
@ -823,10 +824,10 @@ void cosmoB_loadMathLib(CState *state)
|
|||||||
CosmoCFunction mathLib[] = {cosmoB_mAbs, cosmoB_mFloor, cosmoB_mCeil, cosmoB_mSin,
|
CosmoCFunction mathLib[] = {cosmoB_mAbs, cosmoB_mFloor, cosmoB_mCeil, cosmoB_mSin,
|
||||||
cosmoB_mCos, cosmoB_mTan, cosmoB_mASin, cosmoB_mACos,
|
cosmoB_mCos, cosmoB_mTan, cosmoB_mASin, cosmoB_mACos,
|
||||||
cosmoB_mATan, cosmoB_mRad, cosmoB_mDeg};
|
cosmoB_mATan, cosmoB_mRad, cosmoB_mDeg};
|
||||||
|
int i;
|
||||||
|
|
||||||
// make math library object
|
// make math library object
|
||||||
cosmoV_pushString(state, "math");
|
cosmoV_pushString(state, "math");
|
||||||
int i;
|
|
||||||
for (i = 0; i < sizeof(identifiers) / sizeof(identifiers[0]); i++) {
|
for (i = 0; i < sizeof(identifiers) / sizeof(identifiers[0]); i++) {
|
||||||
cosmoV_pushString(state, identifiers[i]);
|
cosmoV_pushString(state, identifiers[i]);
|
||||||
cosmoV_pushCFunction(state, mathLib[i]);
|
cosmoV_pushCFunction(state, mathLib[i]);
|
||||||
@ -871,6 +872,29 @@ int cosmoB_vsetGlobal(CState *state, int nargs, CValue *args)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// vm.disassemble()
|
||||||
|
int cosmoB_vdisassemble(CState *state, int nargs, CValue *args)
|
||||||
|
{
|
||||||
|
CObjClosure *closure;
|
||||||
|
|
||||||
|
if (nargs != 1) {
|
||||||
|
cosmoV_error(state, "Expected 1 argument, got %d!", nargs);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the closure
|
||||||
|
if (!IS_CLOSURE(args[0])) {
|
||||||
|
cosmoV_typeError(state, "vm.disassemble", "<closure>", "%s", cosmoV_typeStr(args[0]));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
closure = cosmoV_readClosure(args[0]);
|
||||||
|
|
||||||
|
// print the disasembly
|
||||||
|
disasmChunk(&closure->function->chunk, closure->function->name ? closure->function->name->str : UNNAMEDCHUNK, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int cosmoB_vindexBProto(CState *state, int nargs, CValue *args)
|
int cosmoB_vindexBProto(CState *state, int nargs, CValue *args)
|
||||||
{
|
{
|
||||||
if (nargs != 2) {
|
if (nargs != 2) {
|
||||||
@ -976,7 +1000,10 @@ void cosmoB_loadVM(CState *state)
|
|||||||
cosmoV_pushString(state, "collect");
|
cosmoV_pushString(state, "collect");
|
||||||
cosmoV_pushCFunction(state, cosmoB_vcollect);
|
cosmoV_pushCFunction(state, cosmoB_vcollect);
|
||||||
|
|
||||||
cosmoV_makeObject(state, 4); // makes the vm object
|
cosmoV_pushString(state, "disassemble");
|
||||||
|
cosmoV_pushCFunction(state, cosmoB_vdisassemble);
|
||||||
|
|
||||||
|
cosmoV_makeObject(state, 5); // makes the vm object
|
||||||
|
|
||||||
// register "vm" to the global table
|
// register "vm" to the global table
|
||||||
cosmoV_register(state, 1);
|
cosmoV_register(state, 1);
|
||||||
|
@ -50,6 +50,7 @@ COSMO_API void cosmoB_loadMathLib(CState *state);
|
|||||||
- manually setting/grabbing base protos of any object (vm.baseProtos)
|
- manually setting/grabbing base protos of any object (vm.baseProtos)
|
||||||
- manually setting/grabbing the global table (vm.globals)
|
- manually setting/grabbing the global table (vm.globals)
|
||||||
- manually invoking a garbage collection event (vm.collect())
|
- manually invoking a garbage collection event (vm.collect())
|
||||||
|
- printing closure disassemblies (vm.disassemble())
|
||||||
|
|
||||||
for this reason, it is recommended to NOT load this library in production
|
for this reason, it is recommended to NOT load this library in production
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user