*** empty log message ***
This commit is contained in:
parent
281207ab33
commit
c7070af2cb
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: bytecode.c,v 1.15 2005-10-02 10:44:49 bacon Exp $
|
* $Id: bytecode.c,v 1.16 2005-10-02 15:45:09 bacon Exp $
|
||||||
*/
|
*/
|
||||||
#include <xp/stx/bytecode.h>
|
#include <xp/stx/bytecode.h>
|
||||||
#include <xp/stx/class.h>
|
#include <xp/stx/class.h>
|
||||||
@ -17,7 +17,6 @@ int xp_stx_decode (xp_stx_t* stx, xp_word_t class)
|
|||||||
class_obj = (xp_stx_class_t*)XP_STX_OBJECT(stx, class);
|
class_obj = (xp_stx_class_t*)XP_STX_OBJECT(stx, class);
|
||||||
if (class_obj->methods == stx->nil) return 0;
|
if (class_obj->methods == stx->nil) return 0;
|
||||||
|
|
||||||
|
|
||||||
/* TODO */
|
/* TODO */
|
||||||
xp_stx_dict_traverse (stx, class_obj->methods, __decode1, class_obj);
|
xp_stx_dict_traverse (stx, class_obj->methods, __decode1, class_obj);
|
||||||
return 0;
|
return 0;
|
||||||
@ -116,7 +115,7 @@ static int __decode2 (xp_stx_t* stx,
|
|||||||
|
|
||||||
static const xp_char_t* stack_special_opcode_names[] =
|
static const xp_char_t* stack_special_opcode_names[] =
|
||||||
{
|
{
|
||||||
XP_TEXT("store_pop_stack_top"),
|
XP_TEXT("pop_stack_top"),
|
||||||
XP_TEXT("duplicate_pop_stack_top"),
|
XP_TEXT("duplicate_pop_stack_top"),
|
||||||
XP_TEXT("push_active_context"),
|
XP_TEXT("push_active_context"),
|
||||||
XP_TEXT("push_nil"),
|
XP_TEXT("push_nil"),
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: bytecode.h,v 1.11 2005-09-30 12:19:00 bacon Exp $
|
* $Id: bytecode.h,v 1.12 2005-10-02 15:45:09 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_STX_BYTECODE_H_
|
#ifndef _XP_STX_BYTECODE_H_
|
||||||
@ -21,7 +21,7 @@
|
|||||||
#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 0x67
|
#define POP_STACK_TOP 0x67
|
||||||
#define DUPLICATE_POP_STACK_TOP 0x68
|
#define DUPLICATE_POP_STACK_TOP 0x68
|
||||||
#define PUSH_ACTIVE_CONTEXT 0x69
|
#define PUSH_ACTIVE_CONTEXT 0x69
|
||||||
#define PUSH_NIL 0x6A
|
#define PUSH_NIL 0x6A
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: class.c,v 1.26 2005-10-02 10:44:49 bacon Exp $
|
* $Id: class.c,v 1.27 2005-10-02 15:45:09 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/stx/class.h>
|
#include <xp/stx/class.h>
|
||||||
@ -113,15 +113,14 @@ xp_word_t xp_stx_lookup_class_variable (
|
|||||||
return stx->nil;
|
return stx->nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
xp_word_t xp_stx_lookup_method (
|
xp_word_t xp_stx_lookup_method (xp_stx_t* stx,
|
||||||
xp_stx_t* stx, xp_word_t class_index, const xp_char_t* name)
|
xp_word_t class_index, const xp_char_t* name, xp_bool_t from_super)
|
||||||
{
|
{
|
||||||
xp_stx_class_t* class_obj;
|
xp_stx_class_t* class_obj;
|
||||||
|
|
||||||
class_obj = (xp_stx_class_t*)XP_STX_OBJECT(stx, class_index);
|
class_obj = (xp_stx_class_t*)XP_STX_OBJECT(stx, class_index);
|
||||||
xp_assert (class_obj != XP_NULL);
|
xp_assert (class_obj != XP_NULL);
|
||||||
|
|
||||||
/* TODO: can a metaclass have class variables? */
|
|
||||||
#if 0
|
#if 0
|
||||||
if (class_obj->header.class != stx->class_metaclass &&
|
if (class_obj->header.class != stx->class_metaclass &&
|
||||||
class_obj->methods != stx->nil) {
|
class_obj->methods != stx->nil) {
|
||||||
@ -143,11 +142,16 @@ xp_word_t xp_stx_lookup_method (
|
|||||||
|
|
||||||
while (class_index != stx->nil) {
|
while (class_index != stx->nil) {
|
||||||
class_obj = (xp_stx_class_t*)XP_STX_OBJECT(stx, class_index);
|
class_obj = (xp_stx_class_t*)XP_STX_OBJECT(stx, class_index);
|
||||||
xp_assert (class_obj != XP_NULL);
|
|
||||||
|
|
||||||
/* TODO: check if this condition is ok */
|
xp_assert (class_obj != XP_NULL);
|
||||||
if (class_obj->header.class != stx->class_metaclass &&
|
xp_assert (
|
||||||
class_obj->methods != stx->nil) {
|
class_obj->header.class == stx->class_metaclass ||
|
||||||
|
XP_STX_CLASS(stx,class_obj->header.class) == stx->class_metaclass);
|
||||||
|
|
||||||
|
if (from_super) {
|
||||||
|
from_super = xp_false;
|
||||||
|
}
|
||||||
|
else if (class_obj->methods != stx->nil) {
|
||||||
xp_word_t assoc;
|
xp_word_t assoc;
|
||||||
assoc = xp_stx_dict_lookup(stx, class_obj->methods, name);
|
assoc = xp_stx_dict_lookup(stx, class_obj->methods, name);
|
||||||
if (assoc != stx->nil) {
|
if (assoc != stx->nil) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: class.h,v 1.14 2005-09-11 15:15:35 bacon Exp $
|
* $Id: class.h,v 1.15 2005-10-02 15:45:09 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_STX_CLASS_H_
|
#ifndef _XP_STX_CLASS_H_
|
||||||
@ -71,8 +71,8 @@ int xp_stx_get_instance_variable_index (
|
|||||||
|
|
||||||
xp_word_t xp_stx_lookup_class_variable (
|
xp_word_t xp_stx_lookup_class_variable (
|
||||||
xp_stx_t* stx, xp_word_t class_index, const xp_char_t* name);
|
xp_stx_t* stx, xp_word_t class_index, const xp_char_t* name);
|
||||||
xp_word_t xp_stx_lookup_method (
|
xp_word_t xp_stx_lookup_method (xp_stx_t* stx,
|
||||||
xp_stx_t* stx, xp_word_t class_index, const xp_char_t* name);
|
xp_word_t class_index, const xp_char_t* name, xp_bool_t from_super);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: interp.c,v 1.18 2005-10-02 10:44:49 bacon Exp $
|
* $Id: interp.c,v 1.19 2005-10-02 15:45:09 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/stx/interp.h>
|
#include <xp/stx/interp.h>
|
||||||
@ -149,6 +149,13 @@ static int __run_process (xp_stx_t* stx, process_t* proc)
|
|||||||
|
|
||||||
/* TODO: more here .... */
|
/* TODO: more here .... */
|
||||||
|
|
||||||
|
else if (code == 0x67) {
|
||||||
|
/* pop stack top */
|
||||||
|
proc->stack_top--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: more here .... */
|
||||||
|
|
||||||
else if (code == 0x6A) {
|
else if (code == 0x6A) {
|
||||||
proc->stack[proc->stack_top++] = stx->nil;
|
proc->stack[proc->stack_top++] = stx->nil;
|
||||||
}
|
}
|
||||||
@ -266,8 +273,9 @@ static int __send_message (xp_stx_t* stx, process_t* proc,
|
|||||||
xp_assert (XP_STX_CLASS(stx,selector) == stx->class_symbol);
|
xp_assert (XP_STX_CLASS(stx,selector) == stx->class_symbol);
|
||||||
|
|
||||||
receiver = proc->stack[proc->stack_top - nargs - 1];
|
receiver = proc->stack[proc->stack_top - nargs - 1];
|
||||||
method = xp_stx_lookup_method (stx,
|
method = xp_stx_lookup_method (
|
||||||
XP_STX_CLASS(stx,receiver), XP_STX_DATA(stx,selector));
|
stx, XP_STX_CLASS(stx,receiver),
|
||||||
|
XP_STX_DATA(stx,selector), to_super);
|
||||||
if (method == stx->nil) {
|
if (method == stx->nil) {
|
||||||
xp_printf (XP_TEXT("cannot find the method....\n"));
|
xp_printf (XP_TEXT("cannot find the method....\n"));
|
||||||
return -1;
|
return -1;
|
||||||
@ -363,6 +371,9 @@ static int __dispatch_primitive (xp_stx_t* stx, process_t* proc, xp_word_t no)
|
|||||||
XP_STX_FROM_SMALLINT(proc->stack[proc->stack_base + 1]),
|
XP_STX_FROM_SMALLINT(proc->stack[proc->stack_base + 1]),
|
||||||
XP_STX_FROM_SMALLINT(proc->stack[proc->stack_base + 2]));
|
XP_STX_FROM_SMALLINT(proc->stack[proc->stack_base + 2]));
|
||||||
break;
|
break;
|
||||||
|
case 20:
|
||||||
|
xp_printf (XP_TEXT("<< PRIMITIVE 20 >>\n"));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: parser.c,v 1.77 2005-10-02 10:44:49 bacon Exp $
|
* $Id: parser.c,v 1.78 2005-10-02 15:45:09 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/stx/parser.h>
|
#include <xp/stx/parser.h>
|
||||||
@ -826,6 +826,7 @@ static int __parse_expression (xp_stx_parser_t* parser)
|
|||||||
* <assignment target> ::= identifier
|
* <assignment target> ::= identifier
|
||||||
* assignmentOperator ::= ':='
|
* assignmentOperator ::= ':='
|
||||||
*/
|
*/
|
||||||
|
xp_stx_t* stx = parser->stx;
|
||||||
|
|
||||||
if (parser->token.type == XP_STX_TOKEN_IDENT) {
|
if (parser->token.type == XP_STX_TOKEN_IDENT) {
|
||||||
xp_char_t* ident = xp_stx_token_yield (&parser->token, 0);
|
xp_char_t* ident = xp_stx_token_yield (&parser->token, 0);
|
||||||
|
@ -153,7 +153,8 @@ int xp_main (int argc, xp_char_t* argv[])
|
|||||||
goto exit_program;
|
goto exit_program;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xp_stx_parser_parse_method (&parser, n,
|
/* compile the method to n's class */
|
||||||
|
if (xp_stx_parser_parse_method (&parser, XP_STX_CLASS(&stx,n),
|
||||||
(void*)XP_TEXT("test.st")) == -1) {
|
(void*)XP_TEXT("test.st")) == -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));
|
||||||
@ -171,8 +172,14 @@ int xp_main (int argc, xp_char_t* argv[])
|
|||||||
xp_stx_parser_error_string (&parser));
|
xp_stx_parser_error_string (&parser));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (xp_stx_parser_parse_method (&parser, stx.class_string,
|
||||||
|
(void*)XP_TEXT("test3.st")) == -1) {
|
||||||
|
xp_printf (XP_TEXT("parser error <%s>\n"),
|
||||||
|
xp_stx_parser_error_string (&parser));
|
||||||
|
}
|
||||||
|
|
||||||
xp_printf (XP_TEXT("\n== Decoded Methods ==\n"));
|
xp_printf (XP_TEXT("\n== Decoded Methods ==\n"));
|
||||||
if (xp_stx_decode(&stx, n) == -1) {
|
if (xp_stx_decode(&stx, XP_STX_CLASS(&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));
|
||||||
}
|
}
|
||||||
@ -183,8 +190,15 @@ 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("\n== Decoded Methods for String ==\n"));
|
||||||
|
if (xp_stx_decode(&stx, stx.class_string) == -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, XP_STX_CLASS(&stx,n), XP_TEXT("main"), xp_false);
|
||||||
if (m == stx.nil) {
|
if (m == stx.nil) {
|
||||||
xp_printf (XP_TEXT("cannot lookup method main\n"));
|
xp_printf (XP_TEXT("cannot lookup method main\n"));
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,5 @@ main
|
|||||||
|
|
||||||
a := #abc print: 123 and: 2345.
|
a := #abc print: 123 and: 2345.
|
||||||
#abc print: a and: a.
|
#abc print: a and: a.
|
||||||
super print: a and: a.
|
|
||||||
1234567.
|
1234567.
|
||||||
^nil.
|
^nil.
|
||||||
|
@ -4,5 +4,6 @@ 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.
|
||||||
self prim2: 2189.
|
super prim2: 999999.
|
||||||
|
self prim2: 999999.
|
||||||
^67891.
|
^67891.
|
||||||
|
2
ase/test/stx/test3.st
Normal file
2
ase/test/stx/test3.st
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
prim2: n
|
||||||
|
<primitive: 20>
|
Loading…
Reference in New Issue
Block a user