*** empty log message ***

This commit is contained in:
hyung-hwan 2005-08-15 16:03:57 +00:00
parent a3f36e0c9b
commit d1c0760ec2
10 changed files with 127 additions and 102 deletions

18
ase/stx/array.c Normal file
View File

@ -0,0 +1,18 @@
/*
* $Id: array.c,v 1.1 2005-08-15 16:03:57 bacon Exp $
*/
#include <xp/stx/array.h>
#include <xp/stx/object.h>
#include <xp/bas/assert.h>
xp_word_t xp_stx_new_array (xp_stx_t* stx, xp_word_t size)
{
xp_word_t x;
xp_assert (stx->class_array != stx->nil);
x = xp_stx_alloc_word_object (stx, XP_NULL, 0, XP_NULL, size);
XP_STX_CLASS(stx,x) = stx->class_array;
return x;
}

21
ase/stx/array.h Normal file
View File

@ -0,0 +1,21 @@
/*
* $Id: array.h,v 1.1 2005-08-15 16:03:57 bacon Exp $
*/
#ifndef _XP_STX_ARRAY_H_
#define _XP_STX_ARRAY_H_
#include <xp/stx/stx.h>
#ifdef __cplusplus
extern "C" {
#endif
xp_word_t xp_stx_new_array (xp_stx_t* stx, xp_word_t size);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,5 +1,5 @@
/*
* $Id: bootstrp.c,v 1.30 2005-08-11 09:57:54 bacon Exp $
* $Id: bootstrp.c,v 1.31 2005-08-15 16:03:57 bacon Exp $
*/
#include <xp/stx/bootstrp.h>
@ -273,17 +273,6 @@ static class_info_t class_info[] =
}
};
xp_word_t INLINE __new_array (xp_stx_t* stx, xp_word_t size)
{
xp_word_t x;
xp_assert (stx->class_array != stx->nil);
x = xp_stx_alloc_word_object (stx, XP_NULL, 0, XP_NULL, size);
XP_STX_CLASS(stx,x) = stx->class_array;
return x;
}
xp_word_t INLINE __new_string (xp_stx_t* stx, const xp_char_t* str)
{
xp_word_t x;
@ -310,6 +299,7 @@ int xp_stx_bootstrap (xp_stx_t* stx)
stx->class_bytearray = xp_stx_new_class (stx, XP_TEXT("ByteArray"));
stx->class_string = xp_stx_new_class (stx, XP_TEXT("String"));
stx->class_character = xp_stx_new_class (stx, XP_TEXT("Character"));
stx->class_context = xp_stx_new_class (stx, XP_TEXT("Context"));
stx->class_system_dictionary =
xp_stx_new_class (stx, XP_TEXT("SystemDictionary"));
stx->class_method =
@ -329,7 +319,7 @@ int xp_stx_bootstrap (xp_stx_t* stx)
/* for some fun here */
{
xp_word_t array;
array = __new_array (stx, 1);
array = xp_stx_new_array (stx, 1);
XP_STX_WORD_AT(stx,array,0) = object_meta;
XP_STX_WORD_AT(stx,stx->class_class,XP_STX_CLASS_SUBCLASSES) = array;
}
@ -541,7 +531,7 @@ static void __create_builtin_classes (xp_stx_t* stx)
/* fill subclasses */
for (p = class_info; p->name != XP_NULL; p++) {
n = __count_subclasses (p->name);
array = __new_array (stx, n);
array = xp_stx_new_array (stx, n);
__set_subclasses (stx, XP_STX_DATA(stx,array), p->name);
class = xp_stx_lookup_class(stx, p->name);
@ -553,7 +543,7 @@ static void __create_builtin_classes (xp_stx_t* stx)
/* fill subclasses for metaclasses */
for (p = class_info; p->name != XP_NULL; p++) {
n = __count_subclasses (p->name);
array = __new_array (stx, n);
array = xp_stx_new_array (stx, n);
__set_metaclass_subclasses (stx, XP_STX_DATA(stx,array), p->name);
class = xp_stx_lookup_class(stx, p->name);

View File

@ -1,105 +1,94 @@
/*
* $Id: interp.c,v 1.4 2005-06-08 16:00:51 bacon Exp $
* $Id: interp.c,v 1.5 2005-08-15 16:03:57 bacon Exp $
*/
#include <xp/stx/interp.h>
#include <xp/stx/method.h>
#include <xp/stx/object.h>
#include <xp/stx/array.h>
#define XP_STX_PROCESS_SIZE 3
#define XP_STX_PROCESS_STACK 0
#define XP_STX_PROCESS_STACK_TOP 1
#define XP_STX_PROCESS_LINK 2
#define XP_STX_CONTEXT_SIZE 4
#define XP_STX_CONTEXT_STACK 0
#define XP_STX_CONTEXT_STACK_TOP 1
#define XP_STX_CONTEXT_METHOD 2
#define XP_STX_CONTEXT_IP 3
#define XP_STX_CONTEXT_SIZE 6
#define XP_STX_PROCESS_LINK 0
#define XP_STX_PROCESS_METHOD 1
#define XP_STX_PROCESS_ARGUMENTS 2
#define XP_STX_PROCESS_TEMPORARIES 3
typedef int (*byte_code_func_t) (xp_stx_t*
static byte_code_func_t byte_code_funcs[] =
struct xp_stx_context_t
{
XP_NULL,
push_instance,
push_argyment,
push_temporary,
push_literal,
push_constant,
store_instance,
store_temporary,
send_message,
send_unary,
send_binary,
XP_NULL,
do_primitive,
XP_NULL,
do_special
xp_stx_objhdr_t header;
xp_word_t stack;
xp_word_t stack_top;
xp_word_t method;
xp_word_t ip;
};
xp_word_t xp_stx_new_method (xp_stx_t* stx)
{
xp_word_t method;
method = xp_stx_alloc_object(XP_STX_METHOD_SIZE);
typedef struct xp_stx_context_t xp_stx_context_t;
return method;
}
xp_word_t xp_stx_new_context (xp_stx_t* stx,
xp_word_t method, xp_word_t args, xp_word_t temp)
xp_word_t xp_stx_new_context (xp_stx_t* stx, xp_word_t method)
{
xp_word_t context;
xp_stx_context_t* ctxobj;
context = xp_stx_alloc_object(XP_STX_CONTEXT_SIZE);
context = xp_stx_alloc_word_object(
stx, XP_NULL, XP_STX_CONTEXT_SIZE, XP_NULL, 0);
XP_STX_CLASS(stx,context) = stx->class_context;
XP_STX_AT(stx,context,XP_STX_CONTEXT_METHOD) = method;
XP_STX_AT(stx,context,XP_STX_CONTEXT_ARGUMENTS) = args;
XP_STX_AT(stx,context,XP_STX_CONTEXT_TEMPORARIES) = temp;
ctxobj = (xp_stx_context_t*)XP_STX_OBJECT(stx,context);
ctxobj->stack = xp_stx_new_array (stx, 256); /* TODO: initial stack size */
ctxobj->stack_top = XP_STX_TO_SMALLINT(0);
ctxobj->method = method;
ctxobj->ip = XP_STX_TO_SMALLINT(0);
return context;
}
xp_word_t xp_stx_new_process (xp_stx_t* stx, xp_word_t method)
int xp_stx_interp (xp_stx_t* stx, xp_word_t context)
{
xp_word_t process, stx;
xp_stx_context_t* ctxobj;
xp_stx_method_t* mthobj;
xp_stx_byte_object_t* bytecodes;
xp_word_t bytecode_size;
xp_word_t* literals;
xp_word_t pc = 0;
int code, next, next2;
process = xp_stx_alloc_object(XP_STX_PROCESS_SIZE);
stack = xp_new_array(stx,50);
ctxobj = (xp_stx_context_t*)XP_STX_OBJECT(stx,context);
mthobj = (xp_stx_method_t*)XP_STX_OBJECT(stx, ctxobj->method);
XP_STX_CLASS(stx,process) = stx->class_process;
XP_STX_AT(stx,process,XP_STX_PROCESS_STACK) = stack;
XP_STX_AT(stx,process,XP_STX_PROCESS_STACKTOP) = XP_STX_FROM_SMALLINT(6);
XP_STX_AT(stx,process,XP_STX_PROCESS_LINK) = XP_STX_FROM_SMALLINT(1);
literals = mthobj->literals;
bytecodes = XP_STX_BYTE_OBJECT(stx, mthobj->bytecodes);
bytecode_size = XP_STX_SIZE(stx, mthobj->bytecodes);
XP_STX_AT(stx,stack,0) = stx->nil; /* argument */
XP_STX_AT(stx,stack,1) = XP_STX_FROM_SMALLINT(0); /* previous link */
XP_STX_AT(stx,stack,2) = stx->nil; /* context */
XP_STX_AT(stx,stack,3) = XP_STX_FROM_SMALLINT(1); /* return point */
XP_STX_AT(stx,stack,4) = method;
XP_STX_AT(stx,stack,5) = XP_STX_FROM_SMALLINT(1); /* byte offset */
while (pc < bytecode_size) {
code = bytecodes->data[pc++];
return process;
if (code >= 0x00 && code <= 0x3F) {
/* stack - push */
int what = code >> 4;
int index = code & 0x0F;
switch (what) {
case 0: /* receiver variable */
break;
case 1: /* temporary variable */
break;
case 2: /* literal constant */
break;
case 3: /* literal variable */
break;
}
int xp_stx_execute (xp_stx_t* stx, xp_word_t process)
{
int low, high;
byte_code_func_t bcfunc;
stack = XP_STX_AT(stx,process,XP_PROCESS_STACK);
stack_top = XP_STX_AT(stx,process,XP_PROCESS_STACK_TOP);
link = XP_STX_AT(stx,process,XP_PROCESS_LINK);
for (;;) {
low = (high = nextByte(&es)) & 0x0F;
high >>= 4;
if(high == 0) {
high = low;
low = nextByte(&es);
}
else if (code >= 0x40 && code <= 0x5F) {
/* stack - store */
int what = code >> 4;
int index = code & 0x0F;
bcfunc = byte_code_funcs[high];
if (bcfunc != XP_NULL) {
bcfunc (stx, low);
switch (what) {
case 4: /* receiver variable */
break;
case 5: /* temporary location */
break;
}
}
}

View File

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

View File

@ -1,5 +1,6 @@
SRCS = stx.c memory.c object.c symbol.c class.c \
dict.c misc.c context.c name.c token.c parser.c bootstrp.c bytecode.c
SRCS = stx.c memory.c object.c symbol.c class.c array.c \
dict.c misc.c context.c name.c token.c parser.c bootstrp.c \
bytecode.c interp.c
OBJS = $(SRCS:.c=.o)
OUT = libxpstx.a

View File

@ -1,5 +1,5 @@
/*
* $Id: parser.c,v 1.67 2005-08-11 16:16:04 bacon Exp $
* $Id: parser.c,v 1.68 2005-08-15 16:03:57 bacon Exp $
*/
#include <xp/stx/parser.h>
@ -844,7 +844,6 @@ static int __parse_expression (xp_stx_parser_t* parser)
if (__parse_basic_expression(parser, XP_NULL) == -1) return -1;
}
return 0;
}
@ -988,9 +987,10 @@ static int __parse_primary_ident (xp_stx_parser_t* parser, const xp_char_t* iden
/*
if (xp_strcmp(token->name.buffer, XP_TEXT("self")) == 0) {
EMIT_PUSH_LITERAL (parser, i);
EMIT_CODE (parser, PUSH_SELF);
}
else if (xp_strcmp(token->name.buffer, XP_TEXT("super")) == 0) {
EMIT_CODE (parser, PUSH_SUPER);
}
*/
if (xp_strcmp(ident, XP_TEXT("nil")) == 0) {

View File

@ -1,5 +1,5 @@
/*
* $Id: stx.c,v 1.36 2005-08-11 09:57:54 bacon Exp $
* $Id: stx.c,v 1.37 2005-08-15 16:03:57 bacon Exp $
*/
#include <xp/stx/stx.h>
@ -44,9 +44,11 @@ xp_stx_t* xp_stx_open (xp_stx_t* stx, xp_word_t capacity)
stx->class_object = XP_STX_NIL;
stx->class_class = XP_STX_NIL;
stx->class_bytearray = XP_STX_NIL;
stx->class_array = XP_STX_NIL;
stx->class_bytearray = XP_STX_NIL;
stx->class_string = XP_STX_NIL;
stx->class_character = XP_STX_NIL;
stx->class_context = XP_STX_NIL;
stx->class_system_dictionary = XP_STX_NIL;
stx->class_method = XP_STX_NIL;
stx->class_smallinteger = XP_STX_NIL;

View File

@ -1,5 +1,5 @@
/*
* $Id: stx.h,v 1.40 2005-08-11 09:57:54 bacon Exp $
* $Id: stx.h,v 1.41 2005-08-15 16:03:57 bacon Exp $
*/
#ifndef _XP_STX_STX_H_
@ -87,6 +87,7 @@ struct xp_stx_t
xp_word_t class_bytearray;
xp_word_t class_string;
xp_word_t class_character;
xp_word_t class_context;
xp_word_t class_system_dictionary;
xp_word_t class_method;
xp_word_t class_smallinteger;

View File

@ -1,2 +1,4 @@
main
| a |
a := nil.
^nil