added some VM code
This commit is contained in:
parent
5da9a789cd
commit
b6f397fea7
@ -1007,36 +1007,6 @@ static int end_include (stix_t* stix)
|
|||||||
* Byte-Code Generator
|
* Byte-Code Generator
|
||||||
* --------------------------------------------------------------------- */
|
* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
#define MAKE_CODE(x,y) (((x) << 4) | y)
|
|
||||||
#define MAX_CODE_INDEX 0xFFFFu
|
|
||||||
#define MAX_CODE_NARGS 0xFFFFu
|
|
||||||
|
|
||||||
#define CMD_EXTEND 0x0
|
|
||||||
#define CMD_EXTEND_DOUBLE 0x1
|
|
||||||
#define CMD_PUSH_INSTVAR 0x2
|
|
||||||
#define CMD_PUSH_TEMPVAR 0x3
|
|
||||||
#define CMD_PUSH_LITERAL 0x4
|
|
||||||
#define CMD_POP_AND_STORE_INTO_INSTVAR 0x5 /* pop and store */
|
|
||||||
#define CMD_POP_AND_STORE_INTO_CLASSVAR 0x6 /* pop and store */
|
|
||||||
#define CMD_POP_AND_STORE_INTO_TEMPVAR 0x7 /* pop and store */
|
|
||||||
|
|
||||||
#define CMD_SEND_MESSAGE_TO_SELF 0xA
|
|
||||||
#define CMD_SEND_MESSAGE_TO_SUPER 0xB
|
|
||||||
|
|
||||||
/* ---------------------------------- */
|
|
||||||
#define CODE_PUSH_RECEIVER 0xE0
|
|
||||||
#define CODE_PUSH_NIL 0xE1
|
|
||||||
#define CODE_PUSH_TRUE 0xE2
|
|
||||||
#define CODE_PUSH_FALSE 0xE3
|
|
||||||
|
|
||||||
/* special code */
|
|
||||||
#define CODE_DUP_STACKTOP 0xF1
|
|
||||||
#define CODE_POP_STACKTOP 0xF2
|
|
||||||
#define CODE_RETURN_MESSAGE_STACKTOP 0xF3
|
|
||||||
#define CODE_RETURN_BLOCK_STACKTOP 0xF4
|
|
||||||
#define CODE_RETURN_MESSAGE_RECEIVER 0xF5
|
|
||||||
#define CODE_EXEC_PRIMITIVE 0xFF
|
|
||||||
|
|
||||||
static STIX_INLINE int emit_byte_instruction (stix_t* stix, stix_byte_t code)
|
static STIX_INLINE int emit_byte_instruction (stix_t* stix, stix_byte_t code)
|
||||||
{
|
{
|
||||||
stix_size_t i;
|
stix_size_t i;
|
||||||
|
@ -219,30 +219,119 @@ static stix_oop_process_t make_process (stix_t* stix, stix_oop_context_t ctx)
|
|||||||
|
|
||||||
int stix_execute (stix_t* stix)
|
int stix_execute (stix_t* stix)
|
||||||
{
|
{
|
||||||
|
|
||||||
stix_oop_method_t mth;
|
stix_oop_method_t mth;
|
||||||
stix_oop_byte_t code;
|
stix_oop_byte_t code;
|
||||||
stix_ooi_t ip;
|
stix_ooi_t ip, sp;
|
||||||
stix_byte_t bc;
|
stix_oop_t receiver;
|
||||||
|
|
||||||
|
stix_byte_t bc, cmd;
|
||||||
|
stix_oow_t b1, b2;
|
||||||
|
|
||||||
|
|
||||||
STIX_ASSERT (stix->active_context != STIX_NULL);
|
STIX_ASSERT (stix->active_context != STIX_NULL);
|
||||||
mth = stix->active_context->method;
|
mth = stix->active_context->method;
|
||||||
ip = STIX_OOP_TO_SMINT(stix->active_context->ip);
|
ip = STIX_OOP_TO_SMINT(stix->active_context->ip);
|
||||||
|
sp = STIX_OOP_TO_SMINT(stix->active_context->sp);
|
||||||
code = mth->code;
|
code = mth->code;
|
||||||
|
receiver = stix->active_context->receiver;
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
bc = code->slot[ip++];
|
bc = code->slot[ip++];
|
||||||
cmd = bc >> 4;
|
cmd = bc >> 4;
|
||||||
if (cmd == CMD_EXTEND)
|
if (cmd == CMD_EXTEND)
|
||||||
{
|
{
|
||||||
cmd = bc & 0xF;
|
cmd = bc & 0xF;
|
||||||
|
b1 = code->slot[ip++];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
b1 = bc & 0xF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf ("CMD => %d, B1 = %d\n", (int)cmd, (int)b1);
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
|
||||||
|
case CMD_PUSH_INSTVAR:
|
||||||
|
printf ("PUSHING INSTVAR %d\n", (int)b1);
|
||||||
|
STIX_ASSERT (STIX_OBJ_GET_FLAGS_TYPE(receiver) == STIX_OBJ_TYPE_OOP);
|
||||||
|
stix->active_context->slot[++sp] = ((stix_oop_oop_t)receiver)->slot[b1];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_PUSH_TEMPVAR:
|
||||||
|
printf ("PUSHING TEMPVAR %d\n", (int)b1);
|
||||||
|
stix->active_context->slot[++sp] = stix->active_context->slot[b1];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_PUSH_LITERAL:
|
||||||
|
stix->active_context->slot[++sp] = mth->slot[b1];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_POP_AND_STORE_INTO_INSTVAR:
|
||||||
|
printf ("STORING INSTVAR %d\n", (int)b1);
|
||||||
|
((stix_oop_oop_t)receiver)->slot[b1] = stix->active_context->slot[sp--];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_POP_AND_STORE_INTO_TEMPVAR:
|
||||||
|
printf ("STORING TEMPVAR %d\n", (int)b1);
|
||||||
|
stix->active_context->slot[b1] = stix->active_context->slot[sp--];
|
||||||
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
case CMD_POP_AND_STORE_INTO_OBJECT_POINTED_TO_BY_LITERAL???
|
||||||
|
*/
|
||||||
|
|
||||||
|
case CMD_SEND_MESSAGE_TO_SELF:
|
||||||
|
case CMD_SEND_MESSAGE_TO_SUPER:
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case CMD_PUSH_SPECIAL:
|
||||||
|
switch (b1)
|
||||||
|
{
|
||||||
|
case SUBCMD_PUSH_RECEIVER:
|
||||||
|
printf ("PUSHING RECEIVER\n");
|
||||||
|
stix->active_context->slot[++sp] = receiver;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SUBCMD_PUSH_NIL:
|
||||||
|
stix->active_context->slot[++sp] = stix->_nil;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SUBCMD_PUSH_TRUE:
|
||||||
|
printf ("PUSHING TRUE\n");
|
||||||
|
stix->active_context->slot[++sp] = stix->_true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SUBCMD_PUSH_FALSE:
|
||||||
|
stix->active_context->slot[++sp] = stix->_false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_DO_SPECIAL:
|
||||||
|
switch (b1)
|
||||||
|
{
|
||||||
|
case SUBCMD_RETURN_MESSAGE_RECEIVER:
|
||||||
|
printf ("RETURNING. RECEIVER...........\n");
|
||||||
|
/* TO RETURN SAVE REGISTERS... RELOAD REGISTERS.. */ goto done;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SUBCMD_RETURN_MESSAGE_STACKTOP:
|
||||||
|
printf ("RETURNING FrOM MESSAGE..........\n"); goto done;
|
||||||
|
break;
|
||||||
|
|
||||||
|
/*case CMD_RETURN_BLOCK_STACKTOP:*/
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
done:
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int stix_invoke (stix_t* stix, const stix_ucs_t* objname, const stix_ucs_t* mthname)
|
int stix_invoke (stix_t* stix, const stix_ucs_t* objname, const stix_ucs_t* mthname)
|
||||||
|
@ -437,6 +437,65 @@ struct stix_compiler_t
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define MAKE_CODE(x,y) (((x) << 4) | y)
|
||||||
|
#define MAX_CODE_INDEX 0xFFFFu
|
||||||
|
#define MAX_CODE_NARGS 0xFFFFu
|
||||||
|
|
||||||
|
#define CMD_EXTEND 0x0
|
||||||
|
#define CMD_EXTEND_DOUBLE 0x1
|
||||||
|
|
||||||
|
/* positional instructions
|
||||||
|
* XXXXJJJJ
|
||||||
|
* 0000XXXX JJJJJJJJ
|
||||||
|
* 0001XXXX JJJJJJJJ JJJJJJJJ
|
||||||
|
*
|
||||||
|
* XXXX is one of the following positional instructions.
|
||||||
|
* JJJJ or JJJJJJJJ is the position.
|
||||||
|
*/
|
||||||
|
#define CMD_PUSH_INSTVAR 0x2
|
||||||
|
#define CMD_PUSH_TEMPVAR 0x3
|
||||||
|
#define CMD_PUSH_LITERAL 0x4
|
||||||
|
#define CMD_POP_AND_STORE_INTO_INSTVAR 0x5 /* pop and store */
|
||||||
|
#define CMD_POP_AND_STORE_INTO_CLASSVAR 0x6 /* pop and store */
|
||||||
|
#define CMD_POP_AND_STORE_INTO_TEMPVAR 0x7 /* pop and store */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XXXXJJJJ KKKKKKKK
|
||||||
|
* 0000XXXX JJJJJJJJ KKKKKKKK
|
||||||
|
* 0001XXXX JJJJJJJJ JJJJJJJJ KKKKKKKK KKKKKKKK
|
||||||
|
*/
|
||||||
|
#define CMD_SEND_MESSAGE_TO_SELF 0xA
|
||||||
|
#define CMD_SEND_MESSAGE_TO_SUPER 0xB
|
||||||
|
|
||||||
|
#define CMD_PUSH_SPECIAL 0xE
|
||||||
|
#define CMD_DO_SPECIAL 0xF
|
||||||
|
|
||||||
|
|
||||||
|
#define SUBCMD_PUSH_RECEIVER 0x0
|
||||||
|
#define SUBCMD_PUSH_NIL 0x1
|
||||||
|
#define SUBCMD_PUSH_TRUE 0x2
|
||||||
|
#define SUBCMD_PUSH_FALSE 0x3
|
||||||
|
|
||||||
|
#define SUBCMD_DUP_STACKTOP 0x0
|
||||||
|
#define SUBCMD_POP_STACKTOP 0x1
|
||||||
|
#define SUBCMD_RETURN_MESSAGE_STACKTOP 0x2
|
||||||
|
#define SUBCMD_RETURN_BLOCK_STACKTOP 0x3
|
||||||
|
#define SUBCMD_RETURN_MESSAGE_RECEIVER 0x4
|
||||||
|
#define SUBCMD_EXEC_PRIMITIVE 0xF
|
||||||
|
/* ---------------------------------- */
|
||||||
|
#define CODE_PUSH_RECEIVER MAKE_CODE(CMD_PUSH_SPECIAL, SUBCMD_PUSH_RECEIVER)
|
||||||
|
#define CODE_PUSH_NIL MAKE_CODE(CMD_PUSH_SPECIAL, SUBCMD_PUSH_NIL)
|
||||||
|
#define CODE_PUSH_TRUE MAKE_CODE(CMD_PUSH_SPECIAL, SUBCMD_PUSH_TRUE)
|
||||||
|
#define CODE_PUSH_FALSE MAKE_CODE(CMD_PUSH_SPECIAL, SUBCMD_PUSH_FALSE)
|
||||||
|
|
||||||
|
/* special code */
|
||||||
|
#define CODE_DUP_STACKTOP MAKE_CODE(CMD_DO_SPECIAL, SUBCMD_DUP_STACKTOP)
|
||||||
|
#define CODE_POP_STACKTOP MAKE_CODE(CMD_DO_SPECIAL, SUBCMD_POP_STACKTOP)
|
||||||
|
#define CODE_RETURN_MESSAGE_STACKTOP MAKE_CODE(CMD_DO_SPECIAL, SUBCMD_RETURN_MESSAGE_STACKTOP)
|
||||||
|
#define CODE_RETURN_BLOCK_STACKTOP MAKE_CODE(CMD_DO_SPECIAL, SUBCMD_RETURN_BLOCK_STACKTOP)
|
||||||
|
#define CODE_RETURN_MESSAGE_RECEIVER MAKE_CODE(CMD_DO_SPECIAL, SUBCMD_RETURN_MESSAGE_RECEIVER)
|
||||||
|
#define CODE_EXEC_PRIMITIVE MAKE_CODE(CMD_DO_SPECIAL, SUBCMD_EXEC_PRIMITIVE)
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user