*** empty log message ***
This commit is contained in:
parent
3d3c41e083
commit
215b487cef
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: bytecode.c,v 1.13 2005-09-13 11:15:41 bacon Exp $
|
* $Id: bytecode.c,v 1.14 2005-09-30 12:19:00 bacon Exp $
|
||||||
*/
|
*/
|
||||||
#include <xp/stx/bytecode.h>
|
#include <xp/stx/bytecode.h>
|
||||||
#include <xp/stx/class.h>
|
#include <xp/stx/class.h>
|
||||||
@ -121,7 +121,8 @@ static int __decode2 (xp_stx_t* stx,
|
|||||||
XP_TEXT("push_active_context"),
|
XP_TEXT("push_active_context"),
|
||||||
XP_TEXT("push_nil"),
|
XP_TEXT("push_nil"),
|
||||||
XP_TEXT("push_true"),
|
XP_TEXT("push_true"),
|
||||||
XP_TEXT("push_false")
|
XP_TEXT("push_false"),
|
||||||
|
XP_TEXT("push_receiver")
|
||||||
};
|
};
|
||||||
|
|
||||||
static const xp_char_t* return_opcode_names[] =
|
static const xp_char_t* return_opcode_names[] =
|
||||||
@ -151,7 +152,7 @@ static int __decode2 (xp_stx_t* stx,
|
|||||||
xp_printf (XP_TEXT("%s %d\n"),
|
xp_printf (XP_TEXT("%s %d\n"),
|
||||||
stack_opcode_names[code & 0x0F], next);
|
stack_opcode_names[code & 0x0F], next);
|
||||||
}
|
}
|
||||||
else if (code >= 0x67 && code <= 0x6C) {
|
else if (code >= 0x67 && code <= 0x6D) {
|
||||||
/* stack special */
|
/* stack special */
|
||||||
xp_printf (XP_TEXT("%s\n"),
|
xp_printf (XP_TEXT("%s\n"),
|
||||||
stack_special_opcode_names[code - 0x67]);
|
stack_special_opcode_names[code - 0x67]);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: bytecode.h,v 1.10 2005-08-18 15:28:18 bacon Exp $
|
* $Id: bytecode.h,v 1.11 2005-09-30 12:19:00 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_STX_BYTECODE_H_
|
#ifndef _XP_STX_BYTECODE_H_
|
||||||
@ -27,6 +27,7 @@
|
|||||||
#define PUSH_NIL 0x6A
|
#define PUSH_NIL 0x6A
|
||||||
#define PUSH_TRUE 0x6B
|
#define PUSH_TRUE 0x6B
|
||||||
#define PUSH_FALSE 0x6C
|
#define PUSH_FALSE 0x6C
|
||||||
|
#define PUSH_RECEIVER 0x6D
|
||||||
|
|
||||||
#define SEND_TO_SELF 0x70
|
#define SEND_TO_SELF 0x70
|
||||||
#define SEND_TO_SUPER 0x71
|
#define SEND_TO_SUPER 0x71
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: interp.c,v 1.15 2005-09-13 15:56:23 bacon Exp $
|
* $Id: interp.c,v 1.16 2005-09-30 12:19:00 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/stx/interp.h>
|
#include <xp/stx/interp.h>
|
||||||
@ -42,6 +42,7 @@ struct process_t
|
|||||||
xp_word_t stack_base;
|
xp_word_t stack_base;
|
||||||
xp_word_t stack_top;
|
xp_word_t stack_top;
|
||||||
|
|
||||||
|
xp_word_t receiver;
|
||||||
xp_word_t method;
|
xp_word_t method;
|
||||||
xp_word_t pc;
|
xp_word_t pc;
|
||||||
|
|
||||||
@ -93,6 +94,7 @@ xp_printf (XP_TEXT("out of memory in xp_stx_interp\n"));
|
|||||||
proc.argcount = XP_STX_FROM_SMALLINT(mthobj->argcount);
|
proc.argcount = XP_STX_FROM_SMALLINT(mthobj->argcount);
|
||||||
proc.tmpcount = XP_STX_FROM_SMALLINT(mthobj->tmpcount);
|
proc.tmpcount = XP_STX_FROM_SMALLINT(mthobj->tmpcount);
|
||||||
|
|
||||||
|
proc.receiver = receiver;
|
||||||
proc.method = method;
|
proc.method = method;
|
||||||
proc.pc = 0;
|
proc.pc = 0;
|
||||||
|
|
||||||
@ -143,10 +145,25 @@ static int __run_process (xp_stx_t* stx, process_t* proc)
|
|||||||
int what = code >> 4;
|
int what = code >> 4;
|
||||||
int index = code & 0x0F;
|
int index = code & 0x0F;
|
||||||
__store_from_stack (stx, proc, code >> 4, code & 0x0F);
|
__store_from_stack (stx, proc, code >> 4, code & 0x0F);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* more here .... */
|
/* TODO: more here .... */
|
||||||
|
|
||||||
|
else if (code == 0x6A) {
|
||||||
|
proc->stack[proc->stack_top++] = stx->nil;
|
||||||
|
}
|
||||||
|
else if (code == 0x6B) {
|
||||||
|
proc->stack[proc->stack_top++] = stx->true;
|
||||||
|
}
|
||||||
|
else if (code == 0x6C) {
|
||||||
|
proc->stack[proc->stack_top++] = stx->false;
|
||||||
|
}
|
||||||
|
else if (code == 0x6D) {
|
||||||
|
/* push receiver */
|
||||||
|
proc->stack[proc->stack_top++] = proc->receiver;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: more here .... */
|
||||||
|
|
||||||
else if (code == 0x70) {
|
else if (code == 0x70) {
|
||||||
next = proc->bytecodes[proc->pc++];
|
next = proc->bytecodes[proc->pc++];
|
||||||
@ -267,6 +284,7 @@ xp_printf (XP_TEXT("cannot find the method....\n"));
|
|||||||
proc->stack_base = proc->stack_top - 3 - tmpcount - argcount - 1;
|
proc->stack_base = proc->stack_top - 3 - tmpcount - argcount - 1;
|
||||||
xp_assert (proc->stack_base > 0);
|
xp_assert (proc->stack_base > 0);
|
||||||
|
|
||||||
|
proc->receiver = receiver;
|
||||||
proc->method = method;
|
proc->method = method;
|
||||||
proc->pc = 0;
|
proc->pc = 0;
|
||||||
|
|
||||||
@ -293,13 +311,17 @@ static int __return_from_message (xp_stx_t* stx, process_t* proc)
|
|||||||
method = proc->stack[proc->stack_base + 1 + proc->tmpcount + proc->argcount + 1];
|
method = proc->stack[proc->stack_base + 1 + proc->tmpcount + proc->argcount + 1];
|
||||||
pc = proc->stack[proc->stack_base + 1 + proc->tmpcount + proc->argcount];
|
pc = proc->stack[proc->stack_base + 1 + proc->tmpcount + proc->argcount];
|
||||||
|
|
||||||
|
|
||||||
mthobj = (xp_stx_method_t*)XP_STX_OBJECT(stx,method);
|
mthobj = (xp_stx_method_t*)XP_STX_OBJECT(stx,method);
|
||||||
xp_assert (mthobj != XP_NULL);
|
xp_assert (mthobj != XP_NULL);
|
||||||
|
|
||||||
|
/* return value is located on top of the previous stack */
|
||||||
|
proc->stack[proc->stack_base - 1] = proc->stack[proc->stack_top - 1];
|
||||||
|
|
||||||
|
/* restore the stack pointers */
|
||||||
proc->stack_top = proc->stack_base;
|
proc->stack_top = proc->stack_base;
|
||||||
proc->stack_base = stack_base;
|
proc->stack_base = stack_base;
|
||||||
|
|
||||||
|
proc->receiver = proc->stack[stack_base];
|
||||||
proc->method = method;
|
proc->method = method;
|
||||||
proc->pc = pc;
|
proc->pc = pc;
|
||||||
|
|
||||||
|
111
ase/stx/parser.c
111
ase/stx/parser.c
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: parser.c,v 1.72 2005-09-13 11:15:41 bacon Exp $
|
* $Id: parser.c,v 1.73 2005-09-30 12:19:00 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/stx/parser.h>
|
#include <xp/stx/parser.h>
|
||||||
@ -33,15 +33,19 @@ static int __parse_assignment (
|
|||||||
static int __parse_basic_expression (
|
static int __parse_basic_expression (
|
||||||
xp_stx_parser_t* parser, const xp_char_t* ident);
|
xp_stx_parser_t* parser, const xp_char_t* ident);
|
||||||
static int __parse_primary (
|
static int __parse_primary (
|
||||||
xp_stx_parser_t* parser, const xp_char_t* ident);
|
xp_stx_parser_t* parser, const xp_char_t* ident, xp_bool_t* is_super);
|
||||||
static int __parse_primary_ident (
|
static int __parse_primary_ident (
|
||||||
xp_stx_parser_t* parser, const xp_char_t* ident);
|
xp_stx_parser_t* parser, const xp_char_t* ident, xp_bool_t* is_super);
|
||||||
|
|
||||||
static int __parse_block_constructor (xp_stx_parser_t* parser);
|
static int __parse_block_constructor (xp_stx_parser_t* parser);
|
||||||
static int __parse_message_continuation (xp_stx_parser_t* parser);
|
static int __parse_message_continuation (
|
||||||
static int __parse_keyword_message (xp_stx_parser_t* parser);
|
xp_stx_parser_t* parser, xp_bool_t is_super);
|
||||||
static int __parse_binary_message (xp_stx_parser_t* parser);
|
static int __parse_keyword_message (
|
||||||
static int __parse_unary_message (xp_stx_parser_t* parser);
|
xp_stx_parser_t* parser, xp_bool_t is_super);
|
||||||
|
static int __parse_binary_message (
|
||||||
|
xp_stx_parser_t* parser, xp_bool_t is_super);
|
||||||
|
static int __parse_unary_message (
|
||||||
|
xp_stx_parser_t* parser, xp_bool_t is_super);
|
||||||
|
|
||||||
static int __get_token (xp_stx_parser_t* parser);
|
static int __get_token (xp_stx_parser_t* parser);
|
||||||
static int __get_ident (xp_stx_parser_t* parser);
|
static int __get_ident (xp_stx_parser_t* parser);
|
||||||
@ -860,11 +864,12 @@ static int __parse_basic_expression (
|
|||||||
/*
|
/*
|
||||||
* <basic expression> ::= <primary> [<messages> <cascaded messages>]
|
* <basic expression> ::= <primary> [<messages> <cascaded messages>]
|
||||||
*/
|
*/
|
||||||
|
xp_bool_t is_super;
|
||||||
|
|
||||||
if (__parse_primary(parser, ident) == -1) return -1;
|
if (__parse_primary(parser, ident, &is_super) == -1) return -1;
|
||||||
if (parser->token.type != XP_STX_TOKEN_END &&
|
if (parser->token.type != XP_STX_TOKEN_END &&
|
||||||
parser->token.type != XP_STX_TOKEN_PERIOD) {
|
parser->token.type != XP_STX_TOKEN_PERIOD) {
|
||||||
if (__parse_message_continuation(parser) == -1) return -1;
|
if (__parse_message_continuation(parser, is_super) == -1) return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -912,7 +917,8 @@ static int __parse_assignment (
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __parse_primary (xp_stx_parser_t* parser, const xp_char_t* ident)
|
static int __parse_primary (
|
||||||
|
xp_stx_parser_t* parser, const xp_char_t* ident, xp_bool_t* is_super)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* <primary> ::=
|
* <primary> ::=
|
||||||
@ -927,7 +933,8 @@ static int __parse_primary (xp_stx_parser_t* parser, const xp_char_t* ident)
|
|||||||
xp_word_t literal;
|
xp_word_t literal;
|
||||||
|
|
||||||
if (parser->token.type == XP_STX_TOKEN_IDENT) {
|
if (parser->token.type == XP_STX_TOKEN_IDENT) {
|
||||||
if (__parse_primary_ident(parser, parser->token.name.buffer) == -1) return -1;
|
if (__parse_primary_ident(parser,
|
||||||
|
parser->token.name.buffer, is_super) == -1) return -1;
|
||||||
GET_TOKEN (parser);
|
GET_TOKEN (parser);
|
||||||
}
|
}
|
||||||
else if (parser->token.type == XP_STX_TOKEN_CHARLIT) {
|
else if (parser->token.type == XP_STX_TOKEN_CHARLIT) {
|
||||||
@ -984,26 +991,30 @@ static int __parse_primary (xp_stx_parser_t* parser, const xp_char_t* ident)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/*if (__parse_primary_ident(parser, parser->token.name.buffer) == -1) return -1;*/
|
/*if (__parse_primary_ident(parser, parser->token.name.buffer) == -1) return -1;*/
|
||||||
if (__parse_primary_ident(parser, ident) == -1) return -1;
|
if (__parse_primary_ident(parser, ident, is_super) == -1) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __parse_primary_ident (xp_stx_parser_t* parser, const xp_char_t* ident)
|
static int __parse_primary_ident (
|
||||||
|
xp_stx_parser_t* parser, const xp_char_t* ident, xp_bool_t* is_super)
|
||||||
{
|
{
|
||||||
xp_word_t i;
|
xp_word_t i;
|
||||||
xp_stx_t* stx = parser->stx;
|
xp_stx_t* stx = parser->stx;
|
||||||
|
|
||||||
/*
|
*is_super = xp_false;
|
||||||
if (xp_strcmp(token->name.buffer, XP_TEXT("self")) == 0) {
|
|
||||||
EMIT_CODE (parser, PUSH_SELF);
|
if (xp_strcmp(ident, XP_TEXT("self")) == 0) {
|
||||||
|
EMIT_CODE (parser, PUSH_RECEIVER);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
else if (xp_strcmp(token->name.buffer, XP_TEXT("super")) == 0) {
|
else if (xp_strcmp(ident, XP_TEXT("super")) == 0) {
|
||||||
EMIT_CODE (parser, PUSH_SUPER);
|
*is_super = xp_true;
|
||||||
|
EMIT_CODE (parser, PUSH_RECEIVER);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
*/
|
else if (xp_strcmp(ident, XP_TEXT("nil")) == 0) {
|
||||||
if (xp_strcmp(ident, XP_TEXT("nil")) == 0) {
|
|
||||||
EMIT_CODE (parser, PUSH_NIL);
|
EMIT_CODE (parser, PUSH_NIL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1097,7 +1108,8 @@ static int __parse_block_constructor (xp_stx_parser_t* parser)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __parse_message_continuation (xp_stx_parser_t* parser)
|
static int __parse_message_continuation (
|
||||||
|
xp_stx_parser_t* parser, xp_bool_t is_super)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* <messages> ::=
|
* <messages> ::=
|
||||||
@ -1106,21 +1118,22 @@ static int __parse_message_continuation (xp_stx_parser_t* parser)
|
|||||||
* <keyword message>
|
* <keyword message>
|
||||||
* <cascaded messages> ::= (';' <messages>)*
|
* <cascaded messages> ::= (';' <messages>)*
|
||||||
*/
|
*/
|
||||||
|
xp_bool_t dummy;
|
||||||
|
|
||||||
if (__parse_keyword_message(parser) == -1) return -1;
|
if (__parse_keyword_message(parser, is_super) == -1) return -1;
|
||||||
|
|
||||||
while (parser->token.type == XP_STX_TOKEN_SEMICOLON) {
|
while (parser->token.type == XP_STX_TOKEN_SEMICOLON) {
|
||||||
EMIT_CODE_TEST (parser, XP_TEXT("DoSpecial(DUP_RECEIVER(CASCADE))"), XP_TEXT(""));
|
EMIT_CODE_TEST (parser, XP_TEXT("DoSpecial(DUP_RECEIVER(CASCADE))"), XP_TEXT(""));
|
||||||
GET_TOKEN (parser);
|
GET_TOKEN (parser);
|
||||||
|
|
||||||
if (__parse_keyword_message (parser) == -1) return -1;
|
if (__parse_keyword_message (parser, &dummy) == -1) return -1;
|
||||||
EMIT_CODE_TEST (parser, XP_TEXT("DoSpecial(POP_TOP)"), XP_TEXT(""));
|
EMIT_CODE_TEST (parser, XP_TEXT("DoSpecial(POP_TOP)"), XP_TEXT(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __parse_keyword_message (xp_stx_parser_t* parser)
|
static int __parse_keyword_message (xp_stx_parser_t* parser, xp_bool_t is_super)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* <keyword message> ::= (keyword <keyword argument> )+
|
* <keyword message> ::= (keyword <keyword argument> )+
|
||||||
@ -1129,9 +1142,10 @@ static int __parse_keyword_message (xp_stx_parser_t* parser)
|
|||||||
|
|
||||||
xp_stx_name_t name;
|
xp_stx_name_t name;
|
||||||
xp_word_t pos;
|
xp_word_t pos;
|
||||||
int nargs = 0;
|
xp_bool_t is_super2;
|
||||||
|
int nargs = 0, n;
|
||||||
|
|
||||||
if (__parse_binary_message (parser) == -1) return -1;
|
if (__parse_binary_message (parser, is_super) == -1) return -1;
|
||||||
if (parser->token.type != XP_STX_TOKEN_KEYWORD) return 0;
|
if (parser->token.type != XP_STX_TOKEN_KEYWORD) return 0;
|
||||||
|
|
||||||
if (xp_stx_name_open(&name, 0) == XP_NULL) {
|
if (xp_stx_name_open(&name, 0) == XP_NULL) {
|
||||||
@ -1147,12 +1161,12 @@ static int __parse_keyword_message (xp_stx_parser_t* parser)
|
|||||||
}
|
}
|
||||||
|
|
||||||
GET_TOKEN (parser);
|
GET_TOKEN (parser);
|
||||||
if (__parse_primary(parser, XP_NULL) == -1) {
|
if (__parse_primary(parser, XP_NULL, &is_super2) == -1) {
|
||||||
xp_stx_name_close (&name);
|
xp_stx_name_close (&name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (__parse_binary_message(parser) == -1) {
|
if (__parse_binary_message(parser, is_super2) == -1) {
|
||||||
xp_stx_name_close (&name);
|
xp_stx_name_close (&name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1161,32 +1175,35 @@ static int __parse_keyword_message (xp_stx_parser_t* parser)
|
|||||||
/* TODO: check if it has too many arguments.. */
|
/* TODO: check if it has too many arguments.. */
|
||||||
} while (parser->token.type == XP_STX_TOKEN_KEYWORD);
|
} while (parser->token.type == XP_STX_TOKEN_KEYWORD);
|
||||||
|
|
||||||
/* TODO: SEND_TO_SUPER */
|
|
||||||
pos = __add_symbol_literal (parser, name.buffer, name.size);
|
pos = __add_symbol_literal (parser, name.buffer, name.size);
|
||||||
if (pos == -1) {
|
if (pos == -1) {
|
||||||
xp_stx_name_close (&name);
|
xp_stx_name_close (&name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/*EMIT_SEND_TO_SELF (parser, nargs, pos);*/
|
|
||||||
if (__emit_send_to_self(parser,nargs,pos) == -1) {
|
n = (is_super)?
|
||||||
|
__emit_send_to_super(parser,nargs,pos):
|
||||||
|
__emit_send_to_self(parser,nargs,pos);
|
||||||
|
if (n == -1) {
|
||||||
xp_stx_name_close (&name);
|
xp_stx_name_close (&name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
xp_stx_name_close (&name);
|
xp_stx_name_close (&name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __parse_binary_message (xp_stx_parser_t* parser)
|
static int __parse_binary_message (xp_stx_parser_t* parser, xp_bool_t is_super)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* <binary message> ::= binarySelector <binary argument>
|
* <binary message> ::= binarySelector <binary argument>
|
||||||
* <binary argument> ::= <primary> <unary message>*
|
* <binary argument> ::= <primary> <unary message>*
|
||||||
*/
|
*/
|
||||||
xp_word_t pos;
|
xp_word_t pos;
|
||||||
|
xp_bool_t is_super2;
|
||||||
|
int n;
|
||||||
|
|
||||||
if (__parse_unary_message (parser) == -1) return -1;
|
if (__parse_unary_message (parser, is_super) == -1) return -1;
|
||||||
|
|
||||||
while (parser->token.type == XP_STX_TOKEN_BINARY) {
|
while (parser->token.type == XP_STX_TOKEN_BINARY) {
|
||||||
xp_char_t* op = xp_stx_token_yield (&parser->token, 0);
|
xp_char_t* op = xp_stx_token_yield (&parser->token, 0);
|
||||||
@ -1196,24 +1213,26 @@ static int __parse_binary_message (xp_stx_parser_t* parser)
|
|||||||
}
|
}
|
||||||
|
|
||||||
GET_TOKEN (parser);
|
GET_TOKEN (parser);
|
||||||
if (__parse_primary(parser, XP_NULL) == -1) {
|
if (__parse_primary(parser, XP_NULL, &is_super2) == -1) {
|
||||||
xp_free (op);
|
xp_free (op);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (__parse_unary_message(parser) == -1) {
|
if (__parse_unary_message(parser, is_super2) == -1) {
|
||||||
xp_free (op);
|
xp_free (op);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: SEND_TO_SUPER */
|
|
||||||
pos = __add_symbol_literal (parser, op, xp_strlen(op));
|
pos = __add_symbol_literal (parser, op, xp_strlen(op));
|
||||||
if (pos == -1) {
|
if (pos == -1) {
|
||||||
xp_free (op);
|
xp_free (op);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/*EMIT_SEND_TO_SELF (parser, 2, pos);*/
|
|
||||||
if (__emit_send_to_self(parser,2,pos) == -1) {
|
n = (is_super)?
|
||||||
|
__emit_send_to_super(parser,2,pos):
|
||||||
|
__emit_send_to_self(parser,2,pos);
|
||||||
|
if (n == -1) {
|
||||||
xp_free (op);
|
xp_free (op);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1224,21 +1243,23 @@ static int __parse_binary_message (xp_stx_parser_t* parser)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __parse_unary_message (xp_stx_parser_t* parser)
|
static int __parse_unary_message (xp_stx_parser_t* parser, xp_bool_t is_super)
|
||||||
{
|
{
|
||||||
/* <unary message> ::= unarySelector */
|
/* <unary message> ::= unarySelector */
|
||||||
|
|
||||||
xp_word_t pos;
|
xp_word_t pos;
|
||||||
|
int n;
|
||||||
|
|
||||||
while (parser->token.type == XP_STX_TOKEN_IDENT) {
|
while (parser->token.type == XP_STX_TOKEN_IDENT) {
|
||||||
/* TODO: SEND_TO_SUPER */
|
|
||||||
/*EMIT_SEND_TO_SELF (parser, 0, index of parser->token.name.buffer);*/
|
|
||||||
/*EMIT_SEND_TO_SELF (parser, 0, 0);*/
|
|
||||||
|
|
||||||
pos = __add_symbol_literal (parser,
|
pos = __add_symbol_literal (parser,
|
||||||
parser->token.name.buffer, parser->token.name.size);
|
parser->token.name.buffer, parser->token.name.size);
|
||||||
if (pos == -1) return -1;
|
if (pos == -1) return -1;
|
||||||
EMIT_SEND_TO_SELF (parser, 0, pos);
|
|
||||||
|
n = (is_super)?
|
||||||
|
__emit_send_to_super(parser,0,pos):
|
||||||
|
__emit_send_to_self(parser,0,pos);
|
||||||
|
if (n == -1) return -1;
|
||||||
|
|
||||||
GET_TOKEN (parser);
|
GET_TOKEN (parser);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stx.h,v 1.43 2005-08-18 15:28:18 bacon Exp $
|
* $Id: stx.h,v 1.44 2005-09-30 12:19:00 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_STX_STX_H_
|
#ifndef _XP_STX_STX_H_
|
||||||
@ -134,12 +134,20 @@ struct xp_stx_t
|
|||||||
#define XP_STX_CHAR_OBJECT(stx,idx) \
|
#define XP_STX_CHAR_OBJECT(stx,idx) \
|
||||||
((xp_stx_char_object_t*)XP_STX_OBJECT(stx,idx))
|
((xp_stx_char_object_t*)XP_STX_OBJECT(stx,idx))
|
||||||
|
|
||||||
|
/*
|
||||||
#define XP_STX_WORD_AT(stx,idx,n) \
|
#define XP_STX_WORD_AT(stx,idx,n) \
|
||||||
(((xp_word_t*)(XP_STX_OBJECT(stx,idx) + 1))[n])
|
(((xp_word_t*)(XP_STX_OBJECT(stx,idx) + 1))[n])
|
||||||
#define XP_STX_BYTE_AT(stx,idx,n) \
|
#define XP_STX_BYTE_AT(stx,idx,n) \
|
||||||
(((xp_byte_t*)(XP_STX_OBJECT(stx,idx) + 1))[n])
|
(((xp_byte_t*)(XP_STX_OBJECT(stx,idx) + 1))[n])
|
||||||
#define XP_STX_CHAR_AT(stx,idx,n) \
|
#define XP_STX_CHAR_AT(stx,idx,n) \
|
||||||
(((xp_char_t*)(XP_STX_OBJECT(stx,idx) + 1))[n])
|
(((xp_char_t*)(XP_STX_OBJECT(stx,idx) + 1))[n])
|
||||||
|
*/
|
||||||
|
#define XP_STX_WORD_AT(stx,idx,n) \
|
||||||
|
(XP_STX_WORD_OBJECT(stx,idx)->data[n])
|
||||||
|
#define XP_STX_BYTE_AT(stx,idx,n) \
|
||||||
|
(XP_STX_BYTE_OBJECT(stx,idx)->data[n])
|
||||||
|
#define XP_STX_CHAR_AT(stx,idx,n) \
|
||||||
|
(XP_STX_CHAR_OBJECT(stx,idx)->data[n])
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -171,12 +171,18 @@ int xp_main (int argc, xp_char_t* argv[])
|
|||||||
xp_stx_parser_error_string (&parser));
|
xp_stx_parser_error_string (&parser));
|
||||||
}
|
}
|
||||||
|
|
||||||
xp_printf (XP_TEXT("== Decoded Methods ==\n"));
|
xp_printf (XP_TEXT("\n== Decoded Methods ==\n"));
|
||||||
if (xp_stx_decode(&stx, n) == -1) {
|
if (xp_stx_decode(&stx, n) == -1) {
|
||||||
xp_printf (XP_TEXT("parser error <%s>\n"),
|
xp_printf (XP_TEXT("parser error <%s>\n"),
|
||||||
xp_stx_parser_error_string (&parser));
|
xp_stx_parser_error_string (&parser));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xp_printf (XP_TEXT("\n== Decoded Methods for Symbol ==\n"));
|
||||||
|
if (xp_stx_decode(&stx, stx.class_symbol) == -1) {
|
||||||
|
xp_printf (XP_TEXT("parser error <%s>\n"),
|
||||||
|
xp_stx_parser_error_string (&parser));
|
||||||
|
}
|
||||||
|
|
||||||
xp_printf (XP_TEXT("== Running the main method ==\n"));
|
xp_printf (XP_TEXT("== Running the main method ==\n"));
|
||||||
m = xp_stx_lookup_method (&stx, n, XP_TEXT("main"));
|
m = xp_stx_lookup_method (&stx, n, XP_TEXT("main"));
|
||||||
if (m == stx.nil) {
|
if (m == stx.nil) {
|
||||||
@ -196,6 +202,7 @@ exit_program:
|
|||||||
muntrace ();
|
muntrace ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
#ifdef __linux
|
#ifdef __linux
|
||||||
{
|
{
|
||||||
char buf[1000];
|
char buf[1000];
|
||||||
@ -203,6 +210,7 @@ exit_program:
|
|||||||
system (buf);
|
system (buf);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
*/
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,4 +10,4 @@ main
|
|||||||
a := #abc print: 123 and: 2345.
|
a := #abc print: 123 and: 2345.
|
||||||
#abc print: a and: a.
|
#abc print: a and: a.
|
||||||
1234567.
|
1234567.
|
||||||
^nil
|
^nil.
|
||||||
|
@ -4,4 +4,5 @@ print: a1 and: a2
|
|||||||
t1 := #abcdefg.
|
t1 := #abcdefg.
|
||||||
"a1 := 2341 arguments are not assignable"
|
"a1 := 2341 arguments are not assignable"
|
||||||
t1 prim2: a2.
|
t1 prim2: a2.
|
||||||
^9999.
|
self prim2: 2189.
|
||||||
|
^67891.
|
||||||
|
Loading…
Reference in New Issue
Block a user