Hi!

Currently sub routines cannot access the outer (main routine/block)
variables, parameters and cursors - #4769.

There is some details to make that happen safely.

Currently a variable cannot have its value changed while its being used.

var = var + <expression>

No expression can reset var.

As soon we let sub routines change outer variables, that will be possible.

Currently VariableNode just returns a descriptor pointing to the
variable's impure_value present in the variable declaration.

To make outer access safe, variables accessed in outer scope would be
flagged and its VariableNode (even in the main routine/block) should
copy the value to its own impure_value. It will be a bit slower, but I
don't see a problem.

What worried me more is how to represent things in BLR. A simple
approach would be to have blr_outer_variable.

But it is not only variables.

There is also parameters, fields, dbkeys, cursor statements.

What seems for me the way to go is to implement single blr_outer_map
that maps main routine's things to sub routines in they own number space.

blr_outer_map,
blr_outer_map_variable,
0,0,
3,0

It maps main's variable 0,0 to this sub routine's 3,0, so it can access
with blr_variable, 3,0.

blr_outer_map,
blr_outer_map_cursor,
1,0,
2,0

Maps main's cursor 1,0 to this sub routine's 2,0, so it can access with
blr_cursor_stmt, 2,0.

Comments?


Adriano


Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to