*** empty log message ***
This commit is contained in:
parent
e57a8f6853
commit
018dd15d3e
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: bytecode.c,v 1.11 2005-09-11 15:15:35 bacon Exp $
|
* $Id: bytecode.c,v 1.12 2005-09-11 17:01:56 bacon Exp $
|
||||||
*/
|
*/
|
||||||
#include <xp/stx/bytecode.h>
|
#include <xp/stx/bytecode.h>
|
||||||
#include <xp/stx/class.h>
|
#include <xp/stx/class.h>
|
||||||
@ -158,8 +158,8 @@ static int __decode2 (xp_stx_t* stx,
|
|||||||
else if (code >= 0x70 && code <= 0x71 ) {
|
else if (code >= 0x70 && code <= 0x71 ) {
|
||||||
/* send */
|
/* send */
|
||||||
next = bytecodes->data[pc++];
|
next = bytecodes->data[pc++];
|
||||||
xp_printf (XP_TEXT("%s %d %d\n"),
|
xp_printf (XP_TEXT("%s nargs(%d) selector(%d)\n"),
|
||||||
send_opcode_names[code - 0x70], next >> 5, next >> 0x1F);
|
send_opcode_names[code - 0x70], next >> 5, next & 0x1F);
|
||||||
}
|
}
|
||||||
else if (code >= 0x72 && code <= 0x73 ) {
|
else if (code >= 0x72 && code <= 0x73 ) {
|
||||||
/* send extended */
|
/* send extended */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: interp.c,v 1.9 2005-09-11 15:43:14 bacon Exp $
|
* $Id: interp.c,v 1.10 2005-09-11 17:01:56 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/stx/interp.h>
|
#include <xp/stx/interp.h>
|
||||||
@ -71,7 +71,7 @@ int xp_stx_interp (xp_stx_t* stx, xp_word_t context)
|
|||||||
xp_stx_context_t* ctxobj;
|
xp_stx_context_t* ctxobj;
|
||||||
xp_stx_method_t* mthobj;
|
xp_stx_method_t* mthobj;
|
||||||
vmcontext_t vmc;
|
vmcontext_t vmc;
|
||||||
int code, next;
|
int code, next, next2;
|
||||||
|
|
||||||
ctxobj = (xp_stx_context_t*)XP_STX_OBJECT(stx,context);
|
ctxobj = (xp_stx_context_t*)XP_STX_OBJECT(stx,context);
|
||||||
mthobj = (xp_stx_method_t*)XP_STX_OBJECT(stx,ctxobj->method);
|
mthobj = (xp_stx_method_t*)XP_STX_OBJECT(stx,ctxobj->method);
|
||||||
@ -130,6 +130,40 @@ int xp_stx_interp (xp_stx_t* stx, xp_word_t context)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* more here .... */
|
||||||
|
|
||||||
|
else if (code == 0x70) {
|
||||||
|
/* send to self */
|
||||||
|
int nargs, selector;
|
||||||
|
next = vmc.bytecodes[vmc.pc++];
|
||||||
|
|
||||||
|
nargs = next >> 5;
|
||||||
|
|
||||||
|
selector = vmc.literals[next & 0x1F];
|
||||||
|
receiver = vmc.stack[--vmc.stack_top];
|
||||||
|
|
||||||
|
xp_stx_lookup_method (stx, class of receiver,
|
||||||
|
}
|
||||||
|
else if (code == 0x71) {
|
||||||
|
/* send to super */
|
||||||
|
int nargs, selector;
|
||||||
|
next = vmc.bytecodes[vmc.pc++];
|
||||||
|
|
||||||
|
nargs = next >> 5;
|
||||||
|
selector = next & 0x1F;
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (code == 0x72) {
|
||||||
|
/* send to self extended */
|
||||||
|
next = vmc.bytecodes[vmc.pc++];
|
||||||
|
next2 = vmc.bytecodes[vmc.pc++];
|
||||||
|
}
|
||||||
|
else if (code == 0x73) {
|
||||||
|
/* send to super extended */
|
||||||
|
next = vmc.bytecodes[vmc.pc++];
|
||||||
|
next2 = vmc.bytecodes[vmc.pc++];
|
||||||
|
}
|
||||||
|
|
||||||
/* more code .... */
|
/* more code .... */
|
||||||
|
|
||||||
else if (code >= 0xF0 && code <= 0xFF) {
|
else if (code >= 0xF0 && code <= 0xFF) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: parser.c,v 1.69 2005-09-11 15:15:35 bacon Exp $
|
* $Id: parser.c,v 1.70 2005-09-11 17:01:56 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/stx/parser.h>
|
#include <xp/stx/parser.h>
|
||||||
@ -441,6 +441,13 @@ static int __add_string_literal (
|
|||||||
return __add_literal (parser, literal);
|
return __add_literal (parser, literal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __add_symbol_literal (
|
||||||
|
xp_stx_parser_t* parser, const xp_char_t* str, xp_word_t size)
|
||||||
|
{
|
||||||
|
xp_stx_t* stx = parser->stx;
|
||||||
|
return __add_literal (parser, xp_stx_new_symbolx(stx, str, size));
|
||||||
|
}
|
||||||
|
|
||||||
int xp_stx_parser_parse_method (
|
int xp_stx_parser_parse_method (
|
||||||
xp_stx_parser_t* parser, xp_word_t method_class, void* input)
|
xp_stx_parser_t* parser, xp_word_t method_class, void* input)
|
||||||
{
|
{
|
||||||
@ -947,7 +954,10 @@ static int __parse_primary (xp_stx_parser_t* parser, const xp_char_t* ident)
|
|||||||
GET_TOKEN (parser);
|
GET_TOKEN (parser);
|
||||||
}
|
}
|
||||||
else if (parser->token.type == XP_STX_TOKEN_SYMLIT) {
|
else if (parser->token.type == XP_STX_TOKEN_SYMLIT) {
|
||||||
EMIT_CODE_TEST (parser, XP_TEXT("PushLiteral(SYM)"), parser->token.name.buffer);
|
pos = __add_symbol_literal (parser,
|
||||||
|
parser->token.name.buffer, parser->token.name.size);
|
||||||
|
if (pos == -1) return -1;
|
||||||
|
EMIT_PUSH_LITERAL_CONSTANT (parser, pos);
|
||||||
GET_TOKEN (parser);
|
GET_TOKEN (parser);
|
||||||
}
|
}
|
||||||
else if (parser->token.type == XP_STX_TOKEN_LBRACKET) {
|
else if (parser->token.type == XP_STX_TOKEN_LBRACKET) {
|
||||||
@ -1198,10 +1208,17 @@ static int __parse_unary_message (xp_stx_parser_t* parser)
|
|||||||
{
|
{
|
||||||
/* <unary message> ::= unarySelector */
|
/* <unary message> ::= unarySelector */
|
||||||
|
|
||||||
|
xp_word_t pos;
|
||||||
|
|
||||||
while (parser->token.type == XP_STX_TOKEN_IDENT) {
|
while (parser->token.type == XP_STX_TOKEN_IDENT) {
|
||||||
/* TODO: SEND_TO_SUPER */
|
/* TODO: SEND_TO_SUPER */
|
||||||
/*EMIT_SEND_TO_SELF (parser, 0, index of parser->token.name.buffer);*/
|
/*EMIT_SEND_TO_SELF (parser, 0, index of parser->token.name.buffer);*/
|
||||||
EMIT_SEND_TO_SELF (parser, 0, 0);
|
/*EMIT_SEND_TO_SELF (parser, 0, 0);*/
|
||||||
|
|
||||||
|
pos = __add_symbol_literal (parser,
|
||||||
|
parser->token.name.buffer, parser->token.name.size);
|
||||||
|
if (pos == -1) return -1;
|
||||||
|
EMIT_SEND_TO_SELF (parser, 0, pos);
|
||||||
GET_TOKEN (parser);
|
GET_TOKEN (parser);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ main
|
|||||||
| a b |
|
| a b |
|
||||||
|
|
||||||
<primitive: 0>
|
<primitive: 0>
|
||||||
a := 1.
|
a := 10.
|
||||||
|
#abc xxx.
|
||||||
b := 3.
|
b := 3.
|
||||||
^nil
|
^nil
|
||||||
|
Loading…
Reference in New Issue
Block a user