mirror of
https://github.com/uffejakobsen/acme.git
synced 2024-11-25 23:49:25 +00:00
comments only
git-svn-id: https://svn.code.sf.net/p/acme-crossass/code-0/trunk@221 4df02467-bbd4-4a76-a152-e7ce94205b78
This commit is contained in:
parent
a165279e88
commit
1f74a6b8fd
@ -47,7 +47,7 @@ struct expression {
|
|||||||
// undefined expression. Needed for producing the same addresses in all
|
// undefined expression. Needed for producing the same addresses in all
|
||||||
// passes; because in the first pass there will almost for sure be
|
// passes; because in the first pass there will almost for sure be
|
||||||
// labels that are undefined, we can't simply get the addressing mode
|
// labels that are undefined, we can't simply get the addressing mode
|
||||||
// from looking at the parameter's value.
|
// from looking at the parameter's value. FIXME - rename to TAINTED :)
|
||||||
|
|
||||||
|
|
||||||
// create dynamic buffer, operator/function trees and operator/operand stacks
|
// create dynamic buffer, operator/function trees and operator/operand stacks
|
||||||
|
15
src/symbol.c
15
src/symbol.c
@ -198,9 +198,17 @@ static void symbol_set_object(struct symbol *symbol, struct object *new_value, b
|
|||||||
// take flags from new value, then OR EVER_UNDEFINED from old value
|
// take flags from new value, then OR EVER_UNDEFINED from old value
|
||||||
flags = (flags & NUMBER_EVER_UNDEFINED) | new_value->u.number.flags;
|
flags = (flags & NUMBER_EVER_UNDEFINED) | new_value->u.number.flags;
|
||||||
} else {
|
} else {
|
||||||
if ((flags & NUMBER_FORCEBITS) == 0)
|
if ((flags & NUMBER_FORCEBITS) == 0) {
|
||||||
if ((flags & (NUMBER_EVER_UNDEFINED | NUMBER_IS_DEFINED)) == 0) // FIXME - this can't happen!?
|
if ((flags & (NUMBER_EVER_UNDEFINED | NUMBER_IS_DEFINED)) == 0) {
|
||||||
|
// FIXME - this can't happen!? Yes, it can!
|
||||||
|
// if the symbol was created just now to be assigned a value,
|
||||||
|
// then both flags are clear before the assignment takes place.
|
||||||
|
// in future this should no longer happen, because creating a
|
||||||
|
// symbol will give it the NULL type, and flags will only
|
||||||
|
// matter if it then gets assigned an int or float value.
|
||||||
flags |= new_value->u.number.flags & NUMBER_FORCEBITS;
|
flags |= new_value->u.number.flags & NUMBER_FORCEBITS;
|
||||||
|
}
|
||||||
|
}
|
||||||
flags |= new_value->u.number.flags & ~NUMBER_FORCEBITS;
|
flags |= new_value->u.number.flags & ~NUMBER_FORCEBITS;
|
||||||
}
|
}
|
||||||
symbol->object.u.number.flags = flags;
|
symbol->object.u.number.flags = flags;
|
||||||
@ -208,7 +216,7 @@ static void symbol_set_object(struct symbol *symbol, struct object *new_value, b
|
|||||||
// FIXME - temporary helper function during refactoring
|
// FIXME - temporary helper function during refactoring
|
||||||
// used for:
|
// used for:
|
||||||
// (implicit!) label definitions, including anons (FIXME - anons cannot have force bits. handle them elsewhere? change backward anons directly, no questions asked?)
|
// (implicit!) label definitions, including anons (FIXME - anons cannot have force bits. handle them elsewhere? change backward anons directly, no questions asked?)
|
||||||
// setting up loop counter for "!for" (actual incrementing is then done directly!)
|
// setting up loop counter for "!for" (CAUTION: actual incrementing is then done directly without calling this function!)
|
||||||
// "change_allowed" is used by backward anons, but then force_bit is 0
|
// "change_allowed" is used by backward anons, but then force_bit is 0
|
||||||
// "change_allowed" is also used by "!for", then force_bit may be nonzero
|
// "change_allowed" is also used by "!for", then force_bit may be nonzero
|
||||||
void symbol_set_object2(struct symbol *symbol, struct object *result, int force_bit, boolean change_allowed)
|
void symbol_set_object2(struct symbol *symbol, struct object *result, int force_bit, boolean change_allowed)
|
||||||
@ -230,6 +238,7 @@ void symbol_set_object3(struct symbol *symbol, struct object *result, int force_
|
|||||||
// (but only do this for numbers!)
|
// (but only do this for numbers!)
|
||||||
if (((symbol->object.type == &type_int) || (symbol->object.type == &type_float))
|
if (((symbol->object.type == &type_int) || (symbol->object.type == &type_float))
|
||||||
&& ((result->type == &type_int) || (result->type == &type_float))) {
|
&& ((result->type == &type_int) || (result->type == &type_float))) {
|
||||||
|
// clear symbol's size flags, set new one, clear result's size flags
|
||||||
symbol->object.u.number.flags &= ~(NUMBER_FORCEBITS | NUMBER_FITS_BYTE);
|
symbol->object.u.number.flags &= ~(NUMBER_FORCEBITS | NUMBER_FITS_BYTE);
|
||||||
if (force_bit) {
|
if (force_bit) {
|
||||||
symbol->object.u.number.flags |= force_bit;
|
symbol->object.u.number.flags |= force_bit;
|
||||||
|
Loading…
Reference in New Issue
Block a user