diff --git a/ase/stx/bytecode.c b/ase/stx/bytecode.c index ccf118ef..f757b838 100644 --- a/ase/stx/bytecode.c +++ b/ase/stx/bytecode.c @@ -1,5 +1,5 @@ /* - * $Id: bytecode.c,v 1.5 2005-07-10 09:21:46 bacon Exp $ + * $Id: bytecode.c,v 1.6 2005-07-10 16:50:50 bacon Exp $ */ #include #include @@ -38,7 +38,7 @@ static int __decode2 (xp_stx_t* stx, { xp_stx_byte_object_t* bytecodes; xp_word_t bytecode_size, pc = 0; - int code, next; + int code, next, next2; static const xp_char_t* stack_opcode_names[] = { XP_TEXT("push_receiver_variable"), @@ -49,6 +49,11 @@ static int __decode2 (xp_stx_t* stx, XP_TEXT("store_temporary_location") }; + static const xp_char_t* send_opcode_names[] = { + XP_TEXT("send_to_self"), + XP_TEXT("send_to_super") + }; + bytecodes = XP_STX_BYTE_OBJECT(stx, method_obj->bytecodes); bytecode_size = XP_STX_SIZE(stx, method_obj->bytecodes); @@ -66,8 +71,19 @@ static int __decode2 (xp_stx_t* stx, xp_printf (XP_TEXT("%s %d\n"), stack_opcode_names[code & 0x0F], next); } - else if (code >= 0x70 && code <= 0x73 ) { + else if (code >= 0x70 && code <= 0x71 ) { /* send */ + next = bytecodes->data[pc++]; + xp_printf (XP_TEXT("%s %d %d\n"), + send_opcode_names[code - 0x70], next >> 5, next >> 0x1F); + } + else if (code >= 0x72 && code <= 0x73 ) { + /* send extended */ + next = bytecodes->data[pc++]; + next2 = bytecodes->data[pc++]; + xp_printf (XP_TEXT("%s %d %d\n"), + send_opcode_names[code - 0x72], next, next2); + } else if (code >= 0x78 && code <= 0x7D) { // return diff --git a/ase/stx/parser.c b/ase/stx/parser.c index 154cdd33..b491aecc 100644 --- a/ase/stx/parser.c +++ b/ase/stx/parser.c @@ -1,5 +1,5 @@ /* - * $Id: parser.c,v 1.61 2005-07-10 09:21:46 bacon Exp $ + * $Id: parser.c,v 1.62 2005-07-10 16:50:50 bacon Exp $ */ #include @@ -285,14 +285,14 @@ static INLINE xp_bool_t __is_closing_char (xp_cint_t c) #define EMIT_RETURN_FROM_MESSAGE(parser) EMIT_CODE(parser, RETURN_FROM_MESSAGE) #define EMIT_RETURN_FROM_BLOCK(parser) EMIT_CODE(parser, RETURN_FROM_BLOCK) -#define EMIT_SEND_TO_SELF(parser,selector,nargs) \ +#define EMIT_SEND_TO_SELF(parser,nargs,selector) \ do { \ - if (__emit_send_to_self(parser,selector,nargs) == -1) return -1; \ + if (__emit_send_to_self(parser,nargs,selector) == -1) return -1; \ } while (0) -#define EMIT_SEND_TO_SUPER(parser,selector,nargs) \ +#define EMIT_SEND_TO_SUPER(parser,nargs,selector) \ do { \ - if (__emit_send_to_super(parser,selector,nargs) == -1) return -1; \ + if (__emit_send_to_super(parser,nargs,selector) == -1) return -1; \ } while (0) #define EMIT_DO_PRIMITIVE(parser,no) \ @@ -318,7 +318,7 @@ static INLINE int __emit_code (xp_stx_parser_t* parser, xp_byte_t code) static INLINE int __emit_stack_positional ( xp_stx_parser_t* parser, int opcode, int pos) { - xp_assert (pos < 0xFF); + xp_assert (pos >= 0x0 && pos <= 0xFF); if (pos <= 0x0F) { EMIT_CODE (parser, (opcode & 0xF0) | (pos & 0x0F)); @@ -332,15 +332,37 @@ static INLINE int __emit_stack_positional ( } static INLINE int __emit_send_to_self ( - xp_stx_parser_t* parser, int selector, int nargs) + xp_stx_parser_t* parser, int nargs, int selector) { + xp_assert (nargs >= 0x00 && nargs <= 0xFF); xp_assert (selector >= 0x00 && selector <= 0xFF); - xp_assert (nargs >= 0x00 nargs <= 0xFF); + + if (nargs <= 0x08 && selector <= 0x1F) { + EMIT_CODE (parser, SEND_TO_SELF); + EMIT_CODE (parser, (nargs << 5) | selector); + } + else { + EMIT_CODE (parser, SEND_TO_SELF_EXTENDED); + EMIT_CODE (parser, nargs); + EMIT_CODE (parser, selector); + } } static INLINE int __emit_send_to_super ( xp_stx_parser_t* parser, int selector, int nargs) { + xp_assert (nargs >= 0x00 && nargs <= 0xFF); + xp_assert (selector >= 0x00 && selector <= 0xFF); + + if (nargs <= 0x08 && selector <= 0x1F) { + EMIT_CODE (parser, SEND_TO_SUPER); + EMIT_CODE (parser, (nargs << 5) | selector); + } + else { + EMIT_CODE (parser, SEND_TO_SUPER_EXTENDED); + EMIT_CODE (parser, nargs); + EMIT_CODE (parser, selector); + } } static INLINE int __emit_do_primitive (xp_stx_parser_t* parser, int no) @@ -994,15 +1016,17 @@ static int __parse_keyword_message (xp_stx_parser_t* parser) */ xp_stx_name_t name; + int nargs = 0; if (__parse_binary_message (parser) == -1) return -1; + if (parser->token.type != XP_STX_TOKEN_KEYWORD) return 0; if (xp_stx_name_open(&name, 0) == XP_NULL) { parser->error_code = XP_STX_PARSER_ERROR_MEMORY; return -1; } - while (parser->token.type == XP_STX_TOKEN_KEYWORD) { + do { if (xp_stx_name_adds(&name, parser->token.name.buffer) == -1) { parser->error_code = XP_STX_PARSER_ERROR_MEMORY; xp_stx_name_close (&name); @@ -1019,9 +1043,14 @@ static int __parse_keyword_message (xp_stx_parser_t* parser) xp_stx_name_close (&name); return -1; } - } - EMIT_CODE_TEST (parser, XP_TEXT("SendKeyword"), name.buffer); + nargs++; + } while (parser->token.type == XP_STX_TOKEN_KEYWORD); + + /* TODO: SEND_TO_SUPER */ + /*EMIT_SEND_TO_SELF (parser, nargs, index of name.buffer);*/ + EMIT_SEND_TO_SELF (parser, nargs, 0); + xp_stx_name_close (&name); return 0; @@ -1054,7 +1083,10 @@ static int __parse_binary_message (xp_stx_parser_t* parser) return -1; } - EMIT_CODE_TEST (parser, XP_TEXT("SendBinary"), op); + /* TODO: SEND_TO_SUPER */ + /*EMIT_SEND_TO_SELF (parser, 2, index of op);*/ + EMIT_SEND_TO_SELF (parser, 2, 0); + xp_free (op); } @@ -1066,7 +1098,9 @@ static int __parse_unary_message (xp_stx_parser_t* parser) /* ::= unarySelector */ while (parser->token.type == XP_STX_TOKEN_IDENT) { - EMIT_CODE_TEST (parser, XP_TEXT("SendUnary"), parser->token.name.buffer); + /* TODO: SEND_TO_SUPER */ + /*EMIT_SEND_TO_SELF (parser, 0, index of parser->token.name.buffer);*/ + EMIT_SEND_TO_SELF (parser, 0, 0); GET_TOKEN (parser); } diff --git a/ase/test/stx/test.st b/ase/test/stx/test.st index 669de709..f04c7176 100644 --- a/ase/test/stx/test.st +++ b/ase/test/stx/test.st @@ -9,7 +9,8 @@ perform: method with: x with: y with: z with: a1 with: b2 with: c2 a := #xxx niceMethod. " b := -30 xxx nil this. - "instanceClass := 10." + b := 30 + 20. + b := 30 xxx: 10 xy zzzz: 30 ccc:10. selector := 20. "