added some VM code

This commit is contained in:
hyunghwan.chung 2015-06-07 14:36:26 +00:00
parent 5da9a789cd
commit b6f397fea7
3 changed files with 153 additions and 35 deletions

View File

@ -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;

View File

@ -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)

View File

@ -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