[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Help-smalltalk] [PATCH] Add instance variables when using extend
From: |
Paolo Bonzini |
Subject: |
[Help-smalltalk] [PATCH] Add instance variables when using extend |
Date: |
Fri, 12 Oct 2007 14:24:59 +0200 |
User-agent: |
Thunderbird 2.0.0.6 (Macintosh/20070728) |
This makes sure that after
Object subclass: A [
| a |
]
A extend [
| b |
]
Class A has *two* instance variables. I found out we need this while
using GNU Smalltalk for other projects.
Paolo
* looking for address@hidden/smalltalk--devo--2.2--patch-602 to compare with
* auto-adding address@hidden/smalltalk--devo--2.2--patch-602 to greedy revision
library /Users/bonzinip/Archives/revlib
* found immediate ancestor revision in library
(address@hidden/smalltalk--devo--2.2--patch-601)
* patching for this revision (address@hidden/smalltalk--devo--2.2--patch-602)
* comparing to address@hidden/smalltalk--devo--2.2--patch-602
M doc/tutorial.texi
M libgst/gst-parse.c
* modified files
--- orig/doc/tutorial.texi
+++ mod/doc/tutorial.texi
@@ -804,7 +804,7 @@ Account extend [
@end example
This instructs Smalltalk to pick an existing class, rather than
-trying to subclass it.
+trying to create a subclass.
@node Defining methods, Instance methods, Documenting the class, Creating
classes
@subsection Defining a method for the class
@@ -863,7 +863,7 @@ how to process this message. It finds o
starts running it. The first line, @code{| r |}, creates a local
variable named @code{r} which can be used as a placeholder for
the objects we create. @code{r} will go away as soon as the message
-is done being processed; note the parallel with @code{balance}, who
+is done being processed; note the parallel with @code{balance}, which
goes away as soon as the object is not used anymore. And note that
here you have to declare local variables explicitly, unlike what
you did in previous examples.
@@ -1410,22 +1410,20 @@ class.
@example
Checking extend [
- | checknum checksleft history |
+ | history |
@end example
-This is the same syntax as the last time we defined a
-checking account, except that we start with @code{extend}
-(since the class is already there) and have three instance variables:
-the @code{checknum} and @code{checksleft} which have always been
-there, and our new @code{history} variable; since we have removed no
-instance variables, the old method will be recompiled without
-errors. We must now feed in our definitions for each of the
-messages our object can handle, since we are basically
-defining a new class under an old name.
-
-With our new Checking instance variable, we are all set
-to start recording our checking history. Our first change
-will be in the handling of the @code{init} message:
+This is the same syntax as the last time we defined a checking account,
+except that we start with @code{extend} (since the class is already
+there). Then, the two instance variables we had defined remain, and we
+add a new @code{history} variable; the old methods will be recompiled
+without errors. We must now feed in our definitions for each of the
+messages our object can handle, since we are basically defining a new
+class under an old name.
+
+With our new Checking instance variable, we are all set to start recording
+our checking history. Our first change will be in the handling of the
address@hidden message:
@example
init [
<category: 'initialization'>
--- orig/libgst/gst-parse.c
+++ mod/libgst/gst-parse.c
@@ -108,13 +108,15 @@ static void parse_eval_definition (gst_p
static mst_Boolean parse_namespace_definition (gst_parser *p,
tree_node first_stmt);
static mst_Boolean parse_class_definition (gst_parser *p,
- OOP classOOP);
+ OOP classOOP,
+ mst_Boolean extend);
static OOP parse_namespace (tree_node name);
static OOP parse_class (tree_node list);
static void parse_scoped_method (gst_parser *p,
OOP classOOP);
static void parse_instance_variables (gst_parser *p,
- OOP classOOP);
+ OOP classOOP,
+ mst_Boolean extend);
static void parse_method_list (gst_parser *p);
static void parse_method (gst_parser *p,
@@ -515,7 +517,7 @@ parse_scoped_definition (gst_parser *p,
if (IS_NIL (classOOP))
_gst_had_error = true;
else
- return parse_class_definition (p, classOOP);
+ return parse_class_definition (p, classOOP, false);
}
}
@@ -547,7 +549,7 @@ parse_scoped_definition (gst_parser *p,
_gst_msg_sendf (NULL, "%v %o current: %o",
_gst_namespace_class, namespace_new);
- ret_value = parse_class_definition (p, classOrMetaclassOOP);
+ ret_value = parse_class_definition (p, classOrMetaclassOOP, true);
if (namespace_new != namespace_old)
_gst_msg_sendf (NULL, "%v %o current: %o",
@@ -617,9 +619,10 @@ parse_namespace_definition (gst_parser *
}
static mst_Boolean
-parse_class_definition (gst_parser *p, OOP classOOP)
+parse_class_definition (gst_parser *p, OOP classOOP, mst_Boolean extend)
{
int t1, t2, t3;
+ mst_Boolean add_inst_vars = extend;
for (;;)
{
@@ -802,7 +805,7 @@ parse_class_definition (gst_parser *p, O
else
{
lex_consume (p, 3);
- parse_class_definition (p, OOP_CLASS (classOOP));
+ parse_class_definition (p, OOP_CLASS (classOOP), extend);
lex_skip_mandatory (p, ']');
}
continue;
@@ -826,7 +829,8 @@ parse_class_definition (gst_parser *p, O
#if 0
printf ("parse instance variables\n");
#endif
- parse_instance_variables (p, classOOP);
+ parse_instance_variables (p, classOOP, add_inst_vars);
+ add_inst_vars = true;
continue;
}
else if (t3 == '[')
@@ -1008,11 +1012,24 @@ parse_namespace (tree_node list)
| empty */
static void
-parse_instance_variables (gst_parser *p, OOP classOOP)
+parse_instance_variables (gst_parser *p, OOP classOOP, mst_Boolean extend)
{
char *vars;
Filament *fil = filnew (NULL, 0);
+ if (extend)
+ {
+ gst_behavior class = (gst_behavior) OOP_TO_OBJ (classOOP);
+ OOP *instVars = OOP_TO_OBJ (class->instanceVariables)->data;
+ int n = NUM_INDEXABLE_FIELDS (class->instanceVariables);
+ for (; n--; instVars++)
+ {
+ char *s = _gst_to_cstring (*instVars);
+ filprintf (fil, "%s ", s);
+ xfree (s);
+ }
+ }
+
lex_skip_mandatory (p, '|');
while (!lex_skip_if (p, '|', true))
{
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Help-smalltalk] [PATCH] Add instance variables when using extend,
Paolo Bonzini <=