diff --git a/ase/stx/bootstrp.c b/ase/stx/bootstrp.c index 5e1dd590..2d26e61e 100644 --- a/ase/stx/bootstrp.c +++ b/ase/stx/bootstrp.c @@ -1,5 +1,5 @@ /* - * $Id: bootstrp.c,v 1.22 2005-07-05 11:15:51 bacon Exp $ + * $Id: bootstrp.c,v 1.23 2005-07-07 07:45:05 bacon Exp $ */ #include @@ -472,7 +472,7 @@ static void __create_builtin_classes (xp_stx_t* stx) } xp_assert (class != stx->nil); - class_obj = (xp_stx_class_t*)XP_STX_WORD_OBJECT(stx, class); + class_obj = (xp_stx_class_t*)XP_STX_OBJECT(stx, class); class_obj->superclass = (p->superclass == XP_NULL)? stx->nil: xp_stx_lookup_class(stx,p->superclass); @@ -485,13 +485,13 @@ static void __create_builtin_classes (xp_stx_t* stx) xp_assert (superclass != stx->nil); meta = class_obj->header.class; - meta_obj = (xp_stx_metaclass_t*)XP_STX_WORD_OBJECT(stx,meta); + meta_obj = (xp_stx_metaclass_t*)XP_STX_OBJECT(stx,meta); meta_obj->superclass = XP_STX_CLASS(stx,superclass); meta_obj->instance_class = class; while (superclass != stx->nil) { superclass_obj = (xp_stx_class_t*) - XP_STX_WORD_OBJECT(stx,superclass); + XP_STX_OBJECT(stx,superclass); nfields += XP_STX_FROM_SMALLINT(superclass_obj->spec) >> XP_STX_SPEC_INDEXABLE_BITS; @@ -518,7 +518,7 @@ static void __create_builtin_classes (xp_stx_t* stx) class = xp_stx_lookup_class(stx, p->name); xp_assert (class != stx->nil); - class_obj = (xp_stx_class_t*)XP_STX_WORD_OBJECT(stx, class); + class_obj = (xp_stx_class_t*)XP_STX_OBJECT(stx, class); if (p->class_variables != XP_NULL) { class_obj->class_variables = @@ -542,7 +542,7 @@ static void __create_builtin_classes (xp_stx_t* stx) class = xp_stx_lookup_class(stx, p->name); xp_assert (class != stx->nil); - class_obj = (xp_stx_class_t*)XP_STX_WORD_OBJECT(stx, class); + class_obj = (xp_stx_class_t*)XP_STX_OBJECT(stx, class); class_obj->subclasses = array; } @@ -555,7 +555,7 @@ static void __create_builtin_classes (xp_stx_t* stx) class = xp_stx_lookup_class(stx, p->name); xp_assert (class != stx->nil); metaclass = XP_STX_CLASS(stx,class); - metaclass_obj = (xp_stx_metaclass_t*)XP_STX_WORD_OBJECT(stx, metaclass); + metaclass_obj = (xp_stx_metaclass_t*)XP_STX_OBJECT(stx, metaclass); metaclass_obj->subclasses = array; } } diff --git a/ase/stx/bytecode.c b/ase/stx/bytecode.c new file mode 100644 index 00000000..beee3034 --- /dev/null +++ b/ase/stx/bytecode.c @@ -0,0 +1,79 @@ +/* + * $Id: bytecode.c,v 1.1 2005-07-07 07:45:05 bacon Exp $ + */ +#include +#include +#include +#include + +static void __decode1 (xp_stx_t* stx, xp_word_t idx, void* data); +static int __decode2 (xp_stx_t* stx, + xp_stx_class_t* class_obj, xp_stx_method_t* method_obj); + +int xp_stx_decode (xp_stx_t* stx, xp_word_t class) +{ + xp_stx_class_t* class_obj; + + class_obj = (xp_stx_class_t*)XP_STX_OBJECT(stx, class); + if (class_obj->methods == stx->nil) return 0; + +/* TODO */ + xp_stx_hash_traverse (stx, class_obj->methods, __decode1, class_obj); + return 0; +} + +static void __decode1 (xp_stx_t* stx, xp_word_t idx, void* data) +{ + xp_stx_method_t* method_obj; + xp_word_t key = XP_STX_WORDAT(stx,idx,XP_STX_PAIRLINK_KEY); + xp_word_t value = XP_STX_WORDAT(stx,idx,XP_STX_PAIRLINK_VALUE); + + xp_printf (XP_TEXT("Method: %s\n"), XP_STX_DATA(stx, key)); + method_obj = (xp_stx_method_t*)XP_STX_OBJECT(stx, value); + __decode2 (stx, data, method_obj); +} + +static int __decode2 (xp_stx_t* stx, + xp_stx_class_t* class_obj, xp_stx_method_t* method_obj) +{ + xp_stx_byte_object_t* bytecodes; + xp_word_t bytecode_size, pc = 0; + xp_byte_t code; + int opcode, operand; + + bytecodes = XP_STX_BYTE_OBJECT(stx, method_obj->bytecodes); + bytecode_size = XP_STX_SIZE(stx, method_obj->bytecodes); + + while (pc < bytecode_size) { + code = bytecodes->data[pc++]; + + opcode = (code & 0xF0) >> 4; + operand = code & 0x0F; + if (opcode > 0x9) { + if (pc >= bytecode_size) { + /* TODO: */ + xp_printf (XP_TEXT("error in bytecodes\n")); + return -1; + } + code = bytecodes->data[pc++]; + operand |= (code << 4); + } + + xp_printf (XP_TEXT("opcode = %d, operand = %d\n"), opcode, operand); + + switch (opcode) { + case DO_PRIMITIVE: + xp_printf (XP_TEXT("DO_PRIMITIVE %d\n"), operand); + break; + case DO_PRIMITIVE_EXTENDED: + xp_printf (XP_TEXT("DO_PIRMITIVE_EXTENDED %d\n"), operand); + break; + default: + xp_printf (XP_TEXT("Unknown\n")); + } + } + + + return 0; +} + diff --git a/ase/stx/bytecode.h b/ase/stx/bytecode.h index 5b681664..ed055c31 100644 --- a/ase/stx/bytecode.h +++ b/ase/stx/bytecode.h @@ -1,14 +1,28 @@ /* - * $Id: bytecode.h,v 1.1 2005-07-05 11:38:01 bacon Exp $ + * $Id: bytecode.h,v 1.2 2005-07-07 07:45:05 bacon Exp $ */ #ifndef _XP_STX_BYTECODE_H_ #define _XP_STX_BYTECODE_H_ -#define PUSH_VARIABLE 0x1 -#define PUSH_ARGUMENT 0x2 -#define PUSH_TEMPORARY 0x3 -#define PUSH_LITERAL 0x4 -#define DO_PRIMITIVE 0xF +#include + +#define PUSH_VARIABLE 0x0 +#define PUSH_ARGUMENT 0x1 +#define PUSH_TEMPORARY 0x2 +#define PUSH_LITERAL 0x3 +#define DO_SPECIAL 0x5 +#define DO_PRIMITIVE 0x6 +#define DO_PRIMITIVE_EXTENDED 0xF + +#ifdef __cplusplus +extern "C" { +#endif + +int xp_stx_decode (xp_stx_t* stx, xp_word_t class_idx); + +#ifdef __cplusplus +} +#endif #endif diff --git a/ase/stx/class.c b/ase/stx/class.c index 20b5bdfe..fe98ac21 100644 --- a/ase/stx/class.c +++ b/ase/stx/class.c @@ -1,5 +1,5 @@ /* - * $Id: class.c,v 1.20 2005-07-05 11:15:51 bacon Exp $ + * $Id: class.c,v 1.21 2005-07-07 07:45:05 bacon Exp $ */ #include @@ -58,7 +58,7 @@ int xp_stx_get_instance_variable_index ( xp_stx_class_t* class_obj; xp_stx_char_object_t* string; - class_obj = (xp_stx_class_t*)XP_STX_WORD_OBJECT(stx, class_index); + class_obj = (xp_stx_class_t*)XP_STX_OBJECT(stx, class_index); xp_assert (class_obj != XP_NULL); if (class_obj->superclass != stx->nil) { @@ -95,7 +95,7 @@ xp_word_t xp_stx_lookup_class_variable ( { xp_stx_class_t* class_obj; - class_obj = (xp_stx_class_t*)XP_STX_WORD_OBJECT(stx, class_index); + class_obj = (xp_stx_class_t*)XP_STX_OBJECT(stx, class_index); xp_assert (class_obj != XP_NULL); if (class_obj->superclass != stx->nil) { diff --git a/ase/stx/hash.c b/ase/stx/hash.c index 210f4556..b2156a19 100644 --- a/ase/stx/hash.c +++ b/ase/stx/hash.c @@ -1,5 +1,5 @@ /* - * $Id: hash.c,v 1.24 2005-07-05 15:01:57 bacon Exp $ + * $Id: hash.c,v 1.25 2005-07-07 07:45:05 bacon Exp $ */ #include @@ -14,7 +14,7 @@ xp_word_t xp_stx_new_pairlink ( x = xp_stx_alloc_word_object ( stx, XP_NULL, XP_STX_PAIRLINK_SIZE, XP_NULL, 0); - obj = (xp_stx_pairlink_t*)XP_STX_WORD_OBJECT(stx, x); + obj = (xp_stx_pairlink_t*)XP_STX_OBJECT(stx, x); obj->header.class = stx->class_pairlink; obj->link = stx->nil; obj->key = key; @@ -42,7 +42,7 @@ xp_word_t xp_stx_hash_lookup ( link = XP_STX_WORDAT(stx,link,XP_STX_PAIRLINK_LINK); */ - obj = (xp_stx_pairlink_t*)XP_STX_WORD_OBJECT(stx,link); + obj = (xp_stx_pairlink_t*)XP_STX_OBJECT(stx,link); if (obj->key == key) return link; link = obj->link; } @@ -63,7 +63,7 @@ xp_word_t xp_stx_hash_lookup_symbol ( link = XP_STX_WORDAT(stx,table,hash); while (link != stx->nil) { - obj = (xp_stx_pairlink_t*)XP_STX_WORD_OBJECT(stx,link); + obj = (xp_stx_pairlink_t*)XP_STX_OBJECT(stx,link); tmp = XP_STX_CHAR_OBJECT(stx,obj->key); if (tmp->header.class == stx->class_symbol && xp_strcmp (tmp->data, name) == 0) return link; @@ -110,7 +110,7 @@ void xp_stx_hash_insert ( void xp_stx_hash_traverse ( xp_stx_t* stx, xp_word_t table, - void (*func) (xp_stx_t*,xp_word_t)) + void (*func) (xp_stx_t*,xp_word_t,void*), void* data) { xp_word_t link; xp_word_t size = XP_STX_SIZE(stx,table); @@ -119,7 +119,7 @@ void xp_stx_hash_traverse ( link = XP_STX_WORDAT(stx,table,size); while (link != stx->nil) { - func (stx,link); + func (stx, link, data); link = XP_STX_WORDAT(stx,link,XP_STX_PAIRLINK_LINK); } } diff --git a/ase/stx/hash.h b/ase/stx/hash.h index 879c3cb6..857b4b3f 100644 --- a/ase/stx/hash.h +++ b/ase/stx/hash.h @@ -1,5 +1,5 @@ /* - * $Id: hash.h,v 1.9 2005-06-08 16:00:51 bacon Exp $ + * $Id: hash.h,v 1.10 2005-07-07 07:45:05 bacon Exp $ */ #ifndef _XP_STX_HASH_H_ @@ -39,7 +39,7 @@ void xp_stx_hash_insert ( xp_word_t hash, xp_word_t key, xp_word_t value); void xp_stx_hash_traverse ( xp_stx_t* stx, xp_word_t table, - void (*func) (xp_stx_t*,xp_word_t)); + void (*func) (xp_stx_t*,xp_word_t,void*), void* data); #ifdef __cplusplus } diff --git a/ase/stx/interp.h b/ase/stx/interp.h index 2b7a79b0..95ca7aa3 100644 --- a/ase/stx/interp.h +++ b/ase/stx/interp.h @@ -1,10 +1,12 @@ /* - * $Id: interp.h,v 1.1 2005-05-13 16:45:55 bacon Exp $ + * $Id: interp.h,v 1.2 2005-07-07 07:45:05 bacon Exp $ */ #ifndef _XP_STX_INTERP_H_ #define _XP_STX_INTERP_H_ +#include + #ifdef __cplusplus extern "C" { #endif diff --git a/ase/stx/makefile.in b/ase/stx/makefile.in index af992bbd..c6dd0ae3 100644 --- a/ase/stx/makefile.in +++ b/ase/stx/makefile.in @@ -1,5 +1,5 @@ SRCS = stx.c memory.c object.c symbol.c class.c \ - hash.c misc.c method.c context.c name.c token.c parser.c bootstrp.c + hash.c misc.c context.c name.c token.c parser.c bootstrp.c bytecode.c OBJS = $(SRCS:.c=.o) OUT = libxpstx.a diff --git a/ase/stx/misc.h b/ase/stx/misc.h index 7dff3a56..eda382b4 100644 --- a/ase/stx/misc.h +++ b/ase/stx/misc.h @@ -1,5 +1,5 @@ /* - * $Id: misc.h,v 1.11 2005-07-05 11:15:51 bacon Exp $ + * $Id: misc.h,v 1.12 2005-07-07 07:45:05 bacon Exp $ */ #ifndef _XP_STX_MISC_H_ @@ -13,6 +13,7 @@ #include #include #include + #include #define xp_assert assert #define xp_malloc malloc @@ -32,6 +33,7 @@ #include #include #include + #include #endif #if defined(__BORLANDC__) || defined(_MSC_VER) diff --git a/ase/stx/object.c b/ase/stx/object.c index 632bd438..d196e639 100644 --- a/ase/stx/object.c +++ b/ase/stx/object.c @@ -1,5 +1,5 @@ /* - * $Id: object.c,v 1.35 2005-07-05 11:15:51 bacon Exp $ + * $Id: object.c,v 1.36 2005-07-07 07:45:05 bacon Exp $ */ #include @@ -192,7 +192,7 @@ xp_word_t xp_stx_instantiate ( xp_word_t spec, nfields, new; int indexable; - class_obj = (xp_stx_class_t*)XP_STX_WORD_OBJECT(stx, class_index); + class_obj = (xp_stx_class_t*)XP_STX_OBJECT(stx, class_index); /* don't instantiate a metaclass whose instance must be created in a different way */ diff --git a/ase/stx/parser.c b/ase/stx/parser.c index c20c75f0..d73d1431 100644 --- a/ase/stx/parser.c +++ b/ase/stx/parser.c @@ -1,5 +1,5 @@ /* - * $Id: parser.c,v 1.55 2005-07-05 11:38:01 bacon Exp $ + * $Id: parser.c,v 1.56 2005-07-07 07:45:05 bacon Exp $ */ #include @@ -117,11 +117,8 @@ void xp_stx_parser_close (xp_stx_parser_t* parser) #define EMIT_CODE_TEST(parser,high,low) \ do { if (__emit_code_test(parser,high,low) == -1) return -1; } while (0) -#define EMIT_CODE(parser,high,low) \ - do { if (__emit_code(parser,high,low) == -1) { \ - parser->error_code = XP_STX_PARSER_ERROR_MEMORY; \ - return -1; \ - } while(0) +#define EMIT_CODE(parser,code) \ + do { if (__emit_code(parser,code) == -1) return -1; } while(0) #define GET_CHAR(parser) \ do { if (__get_char(parser) == -1) return -1; } while (0) @@ -158,6 +155,7 @@ const xp_char_t* xp_stx_parser_error_string (xp_stx_parser_t* parser) XP_TEXT("invalid primitive type"), XP_TEXT("primitive number expected"), + XP_TEXT("primitive number out of range"), XP_TEXT("primitive not closed"), XP_TEXT("temporary list not closed"), @@ -251,9 +249,15 @@ static INLINE int __emit_code_test ( static INLINE int __emit_code (xp_stx_parser_t* parser, xp_byte_t code) { - return (xp_array_add_datum(&parser->bytecode, &code) == XP_NULL)? -1: 0; + if (xp_array_add_datum(&parser->bytecode, &code) == XP_NULL) { + parser->error_code = XP_STX_PARSER_ERROR_MEMORY; + return -1; + } + + return 0; } + int xp_stx_parser_parse_method ( xp_stx_parser_t* parser, xp_word_t method_class, void* input) { @@ -313,7 +317,7 @@ static int __finish_method (xp_stx_parser_t* parser) xp_assert (parser->bytecode.size != 0); class_obj = (xp_stx_class_t*) - XP_STX_WORD_OBJECT(stx, parser->method_class); + XP_STX_OBJECT(stx, parser->method_class); if (class_obj->methods == stx->nil) { /* TODO: reconfigure method dictionary size */ @@ -327,7 +331,7 @@ static int __finish_method (xp_stx_parser_t* parser) method = xp_stx_instantiate(stx, stx->class_method, XP_NULL, parser->literals, parser->literal_count); - method_obj = (xp_stx_method_t*)XP_STX_WORD_OBJECT(stx, method); + method_obj = (xp_stx_method_t*)XP_STX_OBJECT(stx, method); /* TODO: text saving must be optional */ /*method_obj->text = xp_stx_instantiate ( @@ -520,6 +524,8 @@ static int __parse_primitive (xp_stx_parser_t* parser) * ::= '<' 'primitive:' number '>' */ + int prim_no; + if (!__is_primitive_opener(&parser->token)) return 0; GET_TOKEN (parser); @@ -534,16 +540,26 @@ static int __parse_primitive (xp_stx_parser_t* parser) parser->error_code = XP_STX_PARSER_ERROR_PRIMITIVE_NUMBER; return -1; } -EMIT_CODE_TEST (parser, XP_TEXT("DO_PRIMITIVE"), parser->token.name.buffer); -/* - EMIT_CODE_TEST (parser, DO_PRIMITIVE); - EMIT_CODE_TEST (parser, parser->token.ivalue); +/*TODO: more checks the validity of the primitive number */ + if (!xp_stristype(parser->token.name.buffer, xp_isdigit)) { + parser->error_code = XP_STX_PARSER_ERROR_PRIMITIVE_NUMBER; + return -1; + } - EMIT_CODE_TEST (parser, DO_PRIMITIVE_EXTENDED); - EMIT_CODE_TEST (parser, parser->token.ivalue); - EMIT_CODE_TEST (parser, parser->token.ivalue); -*/ + XP_STRTOI (prim_no, parser->token.name.buffer, XP_NULL, 10); + if (prim_no < 0 || prim_no > 0x0FFF) { + parser->error_code = XP_STX_PARSER_ERROR_PRIMITIVE_NUMBER_RANGE; + return -1; + } + + if (prim_no <= 0x0F) { + EMIT_CODE (parser, (DO_PRIMITIVE << 4) | prim_no); + } + else { + EMIT_CODE (parser, (DO_PRIMITIVE_EXTENDED << 4) | (prim_no & 0x0F)); + EMIT_CODE (parser, prim_no >> 4); + } GET_TOKEN (parser); if (!__is_primitive_closer(&parser->token)) { diff --git a/ase/stx/parser.h b/ase/stx/parser.h index 2cf1631c..3b267252 100644 --- a/ase/stx/parser.h +++ b/ase/stx/parser.h @@ -1,5 +1,5 @@ /* - * $Id: parser.h,v 1.29 2005-07-05 09:02:13 bacon Exp $ + * $Id: parser.h,v 1.30 2005-07-07 07:45:05 bacon Exp $ */ #ifndef _XP_STX_PARSER_H_ @@ -32,6 +32,7 @@ enum XP_STX_PARSER_ERROR_PRIMITIVE_KEYWORD, XP_STX_PARSER_ERROR_PRIMITIVE_NUMBER, + XP_STX_PARSER_ERROR_PRIMITIVE_NUMBER_RANGE, XP_STX_PARSER_ERROR_PRIMITIVE_NOT_CLOSED, XP_STX_PARSER_ERROR_TEMPORARIES_NOT_CLOSED, diff --git a/ase/stx/symbol.c b/ase/stx/symbol.c index 5aab5152..a63c8853 100644 --- a/ase/stx/symbol.c +++ b/ase/stx/symbol.c @@ -1,5 +1,5 @@ /* - * $Id: symbol.c,v 1.13 2005-07-05 09:02:13 bacon Exp $ + * $Id: symbol.c,v 1.14 2005-07-07 07:45:05 bacon Exp $ */ #include @@ -138,7 +138,7 @@ xp_word_t xp_stx_new_symbol_pp ( } void xp_stx_traverse_symbol_table ( - xp_stx_t* stx, void (*func) (xp_stx_t*,xp_word_t)) + xp_stx_t* stx, void (*func) (xp_stx_t*,xp_word_t,void*), void* data) { xp_word_t link; xp_word_t size; @@ -151,7 +151,7 @@ void xp_stx_traverse_symbol_table ( link = XP_STX_WORDAT(stx,table,size); while (link != stx->nil) { - func (stx,XP_STX_WORDAT(stx,link,XP_STX_SYMLINK_SYMBOL)); + func (stx, XP_STX_WORDAT(stx,link,XP_STX_SYMLINK_SYMBOL), data); link = XP_STX_WORDAT(stx,link,XP_STX_SYMLINK_LINK); } } diff --git a/ase/stx/symbol.h b/ase/stx/symbol.h index c3e0b5e0..b0008ffc 100644 --- a/ase/stx/symbol.h +++ b/ase/stx/symbol.h @@ -1,5 +1,5 @@ /* - * $Id: symbol.h,v 1.6 2005-06-08 16:00:51 bacon Exp $ + * $Id: symbol.h,v 1.7 2005-07-07 07:45:05 bacon Exp $ */ #ifndef _XP_STX_SYMBOL_H_ @@ -35,7 +35,7 @@ xp_word_t xp_stx_new_symbol_pp ( xp_stx_t* stx, const xp_char_t* name, const xp_char_t* prefix, const xp_char_t* postfix); void xp_stx_traverse_symbol_table ( - xp_stx_t* stx, void (*func) (xp_stx_t*,xp_word_t)); + xp_stx_t* stx, void (*func) (xp_stx_t*,xp_word_t,void*), void* data); #ifdef __cplusplus } diff --git a/ase/test/stx/parser.c b/ase/test/stx/parser.c index f3c9d40a..4bca2c10 100644 --- a/ase/test/stx/parser.c +++ b/ase/test/stx/parser.c @@ -11,6 +11,7 @@ #include #include #include +#include #ifdef __linux #include @@ -153,7 +154,13 @@ int xp_main (int argc, xp_char_t* argv[]) if (xp_stx_parser_parse_method (&parser, n, (void*)XP_TEXT("test.st")) == -1) { xp_printf (XP_TEXT("parser error <%s>\n"), - xp_stx_parser_error_string (&parser)); + xp_stx_parser_error_string (&parser)); + } + + xp_printf (XP_TEXT("== Decoded Methods ==\n")); + if (xp_stx_decode(&stx, n) == -1) { + xp_printf (XP_TEXT("parser error <%s>\n"), + xp_stx_parser_error_string (&parser)); } } diff --git a/ase/test/stx/stx.c b/ase/test/stx/stx.c index d483e159..c6838bc4 100644 --- a/ase/test/stx/stx.c +++ b/ase/test/stx/stx.c @@ -15,12 +15,12 @@ #include #include -void print_symbol_names (xp_stx_t* stx, xp_word_t sym) +void print_symbol_names (xp_stx_t* stx, xp_word_t sym, void* unused) { xp_printf (XP_TEXT("%lu [%s]\n"), (unsigned long)sym, &XP_STX_CHARAT(stx,sym,0)); } -void print_symbol_names_2 (xp_stx_t* stx, xp_word_t idx) +void print_symbol_names_2 (xp_stx_t* stx, xp_word_t idx, void* unused) { xp_word_t key = XP_STX_WORDAT(stx,idx,XP_STX_PAIRLINK_KEY); xp_word_t value = XP_STX_WORDAT(stx,idx,XP_STX_PAIRLINK_VALUE); @@ -167,10 +167,10 @@ int xp_main (int argc, xp_char_t* argv[]) xp_printf (XP_TEXT("stx.false %lu\n"), (unsigned long)stx.false); xp_printf (XP_TEXT("-------------\n")); - xp_stx_traverse_symbol_table (&stx, print_symbol_names); + xp_stx_traverse_symbol_table (&stx, print_symbol_names, XP_NULL); xp_printf (XP_TEXT("-------------\n")); - xp_stx_hash_traverse (&stx, stx.smalltalk, print_symbol_names_2); + xp_stx_hash_traverse (&stx, stx.smalltalk, print_symbol_names_2, XP_NULL); xp_printf (XP_TEXT("-------------\n")); print_superclasses (&stx, XP_TEXT("Array")); diff --git a/ase/test/stx/test.st b/ase/test/stx/test.st index 57d415ff..ef5f573d 100644 --- a/ase/test/stx/test.st +++ b/ase/test/stx/test.st @@ -3,7 +3,7 @@ perform: method with: x with: y with: z with: a with: b with: c | a b c d e f g | - < primitive: 10 > + < primitive: 21 > " a := 'this is ''good'. a := #xxx niceMethod.