This blog site collection has to do with exactly how the CRuby digital maker jobs. If you’re brand-new to the collection, I suggest beginning with the start This article has to do with worldwide variables.
YARV has 2 guidelines in its direction established that associate with worldwide variables: getglobal
and also setglobal
They each have a solitary operand: the name of the worldwide as an icon. The guidelines themselves quite simple, yet worldwide variables can be difficult and also in fact been available in a number of various types.
getglobal
International variables are saved in the worldwide rb_global_tbl
table. This is an interior hash table made use of by CRuby that has ID
s for tricks (the framework that backs Ruby signs) and also struct rb_global_entry *
for worths. The rb_global_entry
framework is specified in variable.c
and also resembles this:
struct rb_global_entry {
struct rb_global_variable * var;
ID id;
bool ractor_local;
};
It keeps a guideline to the struct rb_global_variable
that holds the real worth of the worldwide variable, the ID
of the worldwide variable (the name), and also a boolean showing whether the worldwide variable is ractor-local. Taking this set action better, allow’s check out the framework of rb_global_variable
:
struct rb_global_variable {
int counter;
int block_trace;
WORTH * information;
rb_gvar_getter_t * getter;
rb_gvar_setter_t * setter;
rb_gvar_marker_t * pen;
rb_gvar_compact_t * compactor;
struct trace_var * trace;
};
The areas towards all-time low of that struct are all feature reminders. This is where the variant in worldwide variables enters into play. Essentially, the worldwide that you’ll be managing will certainly keep their worth straight in the information
area that you see there. Nonetheless, there are some situations where the worldwide variable is relied on the fly, and also in those situations, the getter
area will certainly be readied to a feature that will certainly determine the worth of the worldwide variable. The setter
area is made use of for the exact same function, but also for establishing the worth of the worldwide variable. The pen
and also compactor
areas are made use of for trash, and also the trace
area is made use of for mapping.
As an instance, allow’s think about the worldwide variable we ran into when we checked out the getspecial
direction: $ _
This worldwide describes the last line reviewed by an IO approach. The rb_gvar_getter_t *
for this worldwide is in fact designated to get_LAST_READ_LINE
, which after that delegates to rb_lastline_get
, which subsequently delegates to vm_svar_get( GET_EC(), VM_SVAR_LASTLINE)
That feature is in fact the exact same code course as the getspecial
direction that we checked out formerly.
The duty of the getglobal
direction is consequently to bring the entrance representing the name in the worldwide variables table and afterwards to call the getter feature connected with that entrance coming on the rb_global_entry. id
area and also the rb_global_variable. information
area as disagreements. The getter feature will certainly after that return the worth of the worldwide variable. As soon as the worth has actually been determined, it is pressed onto the pile. As an example, with getglobal:$ 0
:
In Ruby:
course GetGlobal
attr_reader : name
def boot up( name)
@name = name
end
def phone call( vm)
vm pile press( vm globals[name])
end
end
In $ 0
disassembly:
== disasm: #<@-e:1( 1,0)> -( 1,2) >(
catch: incorrect ).
0000 getglobal:$ 0( 1)[Li] 0002 leave.
setglobal
Just Like (* )getglobal,
setglobal is in charge of bring the entrance for the worldwide variable equivalent to the name offered by its only operand from the worldwide variable table. It after that calls the setter feature connected with that entrance, coming on the worth to establish the variable to which is stood out off the top of the pile, the
rb_global_entry. id area, and also the
rb_global_variable. information area as disagreements. The setter feature will certainly after that establish the worth of the worldwide variable. As an example, with
setglobal:$ 0:
In Ruby:
course
SetGlobal attr_reader
: name def
boot up ( name) @name
= name end
def
phone call ( vm) vm
globals =[name] vm pile pop end
end
In
$ 0=”!!” disassembly:
== disasm: #<
0000 putstring “!!” (1 )
0002 dup.
0003 setglobal:$ 0.
0005 leave.
[Li] Completing
Think it or otherwise we are midway via the collection in regards to blog posts, and also we are 77 guidelines in to the checklist of 105 guidelines that we are mosting likely to check out! In
this article we spoke about both guidelines in YARV that represent worldwide variables: getglobal and also
setglobal A couple of points to keep in mind from this article:
International variables are saved in the worldwide
- rb_global_tbl
table.
International variables can be relied on the fly, depending upon the means they were established. - In the following article we’ll check out the last sort of variable in Ruby: constants.
← Back to house