Organizing VM sources, CCodeGenerator: suggestions and questions
Stephan Rudlof
sr at evolgo.de
Sat Dec 25 18:40:29 UTC 1999
Dear Andreas,
please take a deeper look onto my suggestions:
"Raab, Andreas" wrote:
>
> Stephan,
>
> > isBytes: oop
> > ^ (interpreterProxy isIntegerObject: oop) not and:
> > [interpreterProxy
> > isBytes: oop]
> >
> > has led to
> >
> > int isBytes(int oop) {
> > return (!((oop & 1))) && (interpreterProxy->isBytes(oop));
> > }
> >
> > . Compiling works only without inlining, otherwise it runs into an
> > infinite recursion.
>
> That's a bug in the code generator, but trivial to fix. Just change your
> method into
>
> isBytes: oop
> self inline: false.
> ^(interpreterProxy isIntegerObject: oop) not and:
> [interpreterProxy isBytes: oop]
>
> The code generator doesn't take the receiver into account which is somewhat
> ugly and should be fixed but I don't know a simple way of fixing this.
>
> > The plugin runs in simulation, but in calling this function
> > in C crashes the VM.
> >
> > The problem here is that this function interferes with the same
> > signatured function from 'sqVirtualMachine.c'.
After taking a second look I have found the _definition_ of isBytes() in
interp.c. In sqVirtualMachine.c there is only an (extern) declaration of
it.
> sqVirtualMachine.c must *never* be compiled with the plugin itself.
I'm working at a plugin and compile only the plugin.
> It
> merely defines the interpreter interface and is compiled with the VM not
> with the plugin! All you need in the plugin is the definition of the
> interface (e.g., from sqVirtualMachine.h) since you don't know beforehand
> with what version of the interpreter you're running.
I know that C interface declarations ordinarily are in *.h files...
>
> > This leads me to the following suggestions:
> >
> > - A compiler warning would be nice, if someone overrides a predefined
> > function.
>
> See above - this shouldn't be necessary if in a plugin.
But I have run exactly in this problem, because I have defined a
function which was also defined in interp.c. I'm strongly supposing that
my VM crashed, because isBytes() is not static there and interfered with
my also not static function.
As test I have made _my_ function 'static' in the plugin source file,
and then it worked in C!
But because the compiler doesn't know about possible conflicts at
running time - it doesn't link the plugin with the VM statically - there
is no solution without
- making 'static' the functions in interp.c, or (not exclusive)
- making 'static' the functions in the plugin sources (see below).
>
> > - Wouldn't it be good to make all user plugin functions which are not
> > exported 'static' as default?
>
> Yes and no ... sometimes it's very convenient if one has outside access to
> these functions and so far I haven't found a case where this causes any
> problems.
Now I have probably found such a case ;-) , a snipped from another
communication follows:
## begin snipped
> >
> > Does regenerating interp.c also create a new sqVirtualMachine.h?
> >
>
> No, it does not.
Then it is impossible to call
class := interpreterProxy classLargeNegativeInteger.
, because in case of LargePositiveInteger it is compiled to
class = interpreterProxy->classLargePositiveInteger();
; and the interpreter struct is declared in sqVirtualMachine.h.
But the function
int classLargePositiveInteger(void);
is defined in interp.c. Because it is not static, the variant for
LargeNegativeIntegers should be directly callable after regenerating the
interpreter.
## end snipped
I have to note that I need access to classLargeNegativeInteger in my
plugin. This is possible in my - updated - image, but the interpreter is
the original one from 2.6. So I have to regenerate the interpreter and
asked if sqVirtualMachine.h - now it is clear that also
sqVirtualMachine.c - is/are regenerated, too.
Therefore I think now that making interp.c functions static could lead
to problems for someone who hasn't used the sqVirtualMachine.h interface
only. But in spite of this I think that making 'static' as much as
possible is a more clean and better programming style.
> > - Wouldn't it be better to make 'int isBytes(int oop);' and similar
> > functions in 'sqVirtualMachine.c' static? For plugins they are called
> > indirectly by 'interpreterProxy->isBytes(oop)' anyway.
>
> sqVirtualMachine.c does *not* define these functions.
I've overlooked that they are _defined_ in interp.c and only _declared_
(implicitly extern) in sqVirtualMachine.c to make the function pointer
assignments to the entries of the VM 'struct VirtualMachine', what on
the other hand is _declared_ in sqVirtualMachine.h together with the
accessing function 'sqGetInterpreterProxy(void)'.
But this doesn't change the problem of external visibility of the VM
functions: If they are _defined_ in this or that source file is
irrelevant.
> Again,
> sqVirtualMachine.c is just for the VM - not for the plugin.
It is not the interface.
>
> > Couldn't there arise any compatibility problems between different
> > plugins in the current situation?
>
> Not that I know of.
I think there could arise such problems if name clashes occure. Or is
there a name space separation between different *.so libraries?
At least between VM executable and my plugin *.so there seemed to be
such a name clash...
> > Greetings, Merry Christmas,
>
> Und ebenfalls schoene Weihnachten und ein frohes neues J2K (oder wie heisst
> das in Deutsch?!)
Es muesste wohl J2T (Tausend!) heissen... Mir ist dieses Kuerzel bisher
allerdings noch nicht aufgefallen.
>
> Andreas
Are you German native speaker?
Greetings,
Stephan
--
Stephan Rudlof (sr at evolgo.de)
"Genius doesn't work on an assembly line basis.
You can't simply say, 'Today I will be brilliant.'"
-- Kirk, "The Ultimate Computer", stardate 4731.3
More information about the Squeak-dev
mailing list
|