*** empty log message ***

This commit is contained in:
hyung-hwan 2005-08-11 16:16:04 +00:00
parent 1a229b9d41
commit 70fa033b9f
5 changed files with 62 additions and 24 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: bytecode.c,v 1.8 2005-07-19 12:08:04 bacon Exp $ * $Id: bytecode.c,v 1.9 2005-08-11 16:16:04 bacon Exp $
*/ */
#include <xp/stx/bytecode.h> #include <xp/stx/bytecode.h>
#include <xp/stx/class.h> #include <xp/stx/class.h>
@ -85,7 +85,8 @@ static int __decode2 (xp_stx_t* stx,
xp_word_t bytecode_size, pc = 0; xp_word_t bytecode_size, pc = 0;
int code, next, next2; int code, next, next2;
static const xp_char_t* stack_opcode_names[] = { static const xp_char_t* stack_opcode_names[] =
{
XP_TEXT("push_receiver_variable"), XP_TEXT("push_receiver_variable"),
XP_TEXT("push_temporary_location"), XP_TEXT("push_temporary_location"),
XP_TEXT("push_literal_constant"), XP_TEXT("push_literal_constant"),
@ -94,11 +95,31 @@ static int __decode2 (xp_stx_t* stx,
XP_TEXT("store_temporary_location") XP_TEXT("store_temporary_location")
}; };
static const xp_char_t* send_opcode_names[] = { static const xp_char_t* send_opcode_names[] =
{
XP_TEXT("send_to_self"), XP_TEXT("send_to_self"),
XP_TEXT("send_to_super") XP_TEXT("send_to_super")
}; };
static const xp_char_t* stack_special_opcode_names[] =
{
XP_TEXT("store_pop_stack_top"),
XP_TEXT("duplicate_pop_stack_top"),
XP_TEXT("push_active_context"),
XP_TEXT("push_nil"),
XP_TEXT("push_true"),
XP_TEXT("push_false")
};
static const xp_char_t* return_opcode_names[] =
{
XP_TEXT("return_receiver"),
XP_TEXT("return_true"),
XP_TEXT("return_false"),
XP_TEXT("return_nil"),
XP_TEXT("return_from_message"),
XP_TEXT("return_from_block")
};
bytecodes = XP_STX_BYTE_OBJECT(stx, method_obj->bytecodes); bytecodes = XP_STX_BYTE_OBJECT(stx, method_obj->bytecodes);
bytecode_size = XP_STX_SIZE(stx, method_obj->bytecodes); bytecode_size = XP_STX_SIZE(stx, method_obj->bytecodes);
@ -117,6 +138,12 @@ 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) {
/* stack special */
xp_printf (XP_TEXT("%s\n"),
stack_special_opcode_names[code - 0x67]);
}
else if (code >= 0x70 && code <= 0x71 ) { else if (code >= 0x70 && code <= 0x71 ) {
/* send */ /* send */
next = bytecodes->data[pc++]; next = bytecodes->data[pc++];
@ -132,7 +159,8 @@ static int __decode2 (xp_stx_t* stx,
} }
else if (code >= 0x78 && code <= 0x7D) { else if (code >= 0x78 && code <= 0x7D) {
// return xp_printf (XP_TEXT("%s\n"),
return_opcode_names[code - 0x78]);
} }
else if (code >= 0x80 && code <= 0x8F) { else if (code >= 0x80 && code <= 0x8F) {
// jump // jump

View File

@ -1,5 +1,5 @@
/* /*
* $Id: bytecode.h,v 1.7 2005-07-10 09:21:46 bacon Exp $ * $Id: bytecode.h,v 1.8 2005-08-11 16:16:04 bacon Exp $
*/ */
#ifndef _XP_STX_BYTECODE_H_ #ifndef _XP_STX_BYTECODE_H_
@ -20,9 +20,13 @@
#define PUSH_LITERAL_VARIABLE_EXTENDED 0x63 #define PUSH_LITERAL_VARIABLE_EXTENDED 0x63
#define STORE_RECEIVER_VARIABLE_EXTENDED 0x64 #define STORE_RECEIVER_VARIABLE_EXTENDED 0x64
#define STORE_TEMPORARY_LOCATION_EXTENDED 0x65 #define STORE_TEMPORARY_LOCATION_EXTENDED 0x65
#define STORE_POP_STACK_TOP 0x68
#define DUPLICATE_POP_STACK_TOP 0x69 #define STORE_POP_STACK_TOP 0x67
#define PUSH_ACTIVE_CONTEXT 0x6A #define DUPLICATE_POP_STACK_TOP 0x68
#define PUSH_ACTIVE_CONTEXT 0x69
#define PUSH_NIL 0x6A
#define PUSH_TRUE 0x6B
#define PUSH_FALSE 0x6C
#define SEND_TO_SELF 0x70 #define SEND_TO_SELF 0x70
#define SEND_TO_SUPER 0x71 #define SEND_TO_SUPER 0x71

View File

@ -1,6 +1,6 @@
SRCS = \ SRCS = \
stx.c memory.c object.c symbol.c class.c \ stx.c memory.c object.c symbol.c class.c \
dict.c misc.c context.c name.c token.c parser.c bootstrp.c dict.c misc.c context.c name.c token.c parser.c bootstrp.c bytecode.c
OBJS = $(SRCS:.c=.obj) OBJS = $(SRCS:.c=.obj)
OUT = xpstx.lib OUT = xpstx.lib

View File

@ -1,5 +1,5 @@
/* /*
* $Id: parser.c,v 1.66 2005-08-11 11:18:30 bacon Exp $ * $Id: parser.c,v 1.67 2005-08-11 16:16:04 bacon Exp $
*/ */
#include <xp/stx/parser.h> #include <xp/stx/parser.h>
@ -769,6 +769,7 @@ static int __parse_statements (xp_stx_parser_t* parser)
} }
} }
EMIT_RETURN_FROM_MESSAGE (parser);
return 0; return 0;
} }
@ -973,7 +974,8 @@ 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;
} }
return 0; return 0;
@ -990,13 +992,19 @@ static int __parse_primary_ident (xp_stx_parser_t* parser, const xp_char_t* iden
} }
else if (xp_strcmp(token->name.buffer, XP_TEXT("super")) == 0) { else if (xp_strcmp(token->name.buffer, XP_TEXT("super")) == 0) {
} }
else if (xp_strcmp(token->name.buffer, XP_TEXT("nil")) == 0) {
}
else if (xp_strcmp(token->name.buffer, XP_TEXT("true")) == 0) {
}
else if (xp_strcmp(token->name.buffer, XP_TEXT("false")) == 0) {
}
*/ */
if (xp_strcmp(ident, XP_TEXT("nil")) == 0) {
EMIT_CODE (parser, PUSH_NIL);
return 0;
}
else if (xp_strcmp(ident, XP_TEXT("true")) == 0) {
EMIT_CODE (parser, PUSH_TRUE);
return 0;
}
else if (xp_strcmp(ident, XP_TEXT("false")) == 0) {
EMIT_CODE (parser, PUSH_FALSE);
return 0;
}
/* Refer to __parse_assignment for identifier lookup */ /* Refer to __parse_assignment for identifier lookup */
@ -1128,12 +1136,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) == -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) == -1) {
xp_stx_name_close (&name); xp_stx_name_close (&name);
return -1; return -1;
} }
@ -1167,12 +1175,12 @@ 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) == -1) {
xp_free (op); xp_free (op);
return -1; return -1;
} }
if (__parse_unary_message (parser) == -1) { if (__parse_unary_message(parser) == -1) {
xp_free (op); xp_free (op);
return -1; return -1;
} }

View File

@ -1,4 +1,2 @@
main main
< primitive: 16 > ^nil
^nil.