nitc :: AAttrFormExpr :: _attr_type
The static type of the attribute.nitc :: AAttrFormExpr :: _id
Identifier of the class which introduced the attributenitc :: AAttrFormExpr :: _mproperty
The attribute accessed.nitc :: AAttrFormExpr :: _offset
Position of the attribute in attribute tablenitc :: AAttrFormExpr :: _status
Indicate the status of the optimization for this nodenitc :: AAttrFormExpr :: attr_type=
The static type of the attribute.nitc :: AAttrFormExpr :: defaultinit
nitc :: AAttrFormExpr :: id=
Identifier of the class which introduced the attributenitc :: AAttrFormExpr :: mproperty=
The attribute accessed.nitc :: AAttrFormExpr :: offset=
Position of the attribute in attribute tablenitc :: AAttrFormExpr :: optimize
Optimize this attribute accessnitc :: AAttrFormExpr :: resolve_property
Resolve the attribute accessed.nitc :: AAttrFormExpr :: status
Indicate the status of the optimization for this nodenitc :: AAttrFormExpr :: status=
Indicate the status of the optimization for this nodenitc $ AAttrFormExpr :: SELF
Type of this instance, automatically specialized in every classnitc :: htmlight $ AAttrFormExpr :: decorate_tag
Add aditionnal information on a child-token and return an additionnal HInfoBox on itnitc :: AExpr :: _after_flow_context
The flow after the full evaluation of the expression/statementnitc :: AAttrFormExpr :: _attr_type
The static type of the attribute.nitc :: AExpr :: _comprehension
Is non-null ifself
is a leaf of a comprehension array construction.
nitc :: Prod :: _first_location
Location on the first token after the start of a productionnitc :: Prod :: _first_token
The first token of the production in the ASTnitc :: AAttrFormExpr :: _id
Identifier of the class which introduced the attributenitc :: AExpr :: _implicit_cast_to
If required, the following implicit cast.as(XXX)
nitc :: ANode :: _is_broken
The indication that the node did not pass some semantic verifications.nitc :: Prod :: _last_token
The last token of the production in the ASTnitc :: AAttrFormExpr :: _mproperty
The attribute accessed.nitc :: Prod :: _n_annotations
All the annotations attached directly to the nodenitc :: AAttrFormExpr :: _offset
Position of the attribute in attribute tablenitc :: AAttrFormExpr :: _status
Indicate the status of the optimization for this nodenitc :: AExpr :: _vararg_decl
It indicates the number of arguments collected as a vararg.nitc :: AExpr :: _variable_cache
nitc :: ANode :: accept_ast_validation
nitc :: ANode :: accept_auto_super_init
nitc :: AExpr :: accept_explain_assert
Fillv
to explain this node if the parent assert fails
nitc :: ANode :: accept_flow_visitor
nitc :: ANode :: accept_forward_analysis
Apply the forward analysisv
to self
.
nitc :: ANode :: accept_literal
nitc :: ANode :: accept_post_typing
nitc :: ANode :: accept_pretty_printer
Start visit ofself
using a PrettyPrinterVisitor
nitc :: ANode :: accept_reaching_defs
Apply a ReachingDefsAnalysis toself
.
nitc :: ANode :: accept_regex_visitor
nitc :: ANode :: accept_scope_visitor
nitc :: ANode :: accept_simple_misc
nitc :: ANode :: accept_string_finder
nitc :: AExpr :: accept_typing
nitc :: AExpr :: after_flow_context
The flow after the full evaluation of the expression/statementnitc :: AExpr :: after_flow_context=
The flow after the full evaluation of the expression/statementnitc :: ANode :: after_simple_misc
nitc :: AExpr :: allocate_mtype
Make themtype
of the expression live
nitc :: AAttrFormExpr :: attr_type=
The static type of the attribute.nitc :: ANode :: bad_expr_message
An additional information message to explain the role of a child expression.nitc :: ANode :: check_callsite
core :: Object :: class_factory
Implementation used byget_class
to create the specific class.
nitc :: ANode :: collect_annotations_by_name
Do a deep search and return an array of node that are annotatednitc :: Prod :: collect_comments
Collect allTComment
contained in the production
nitc :: ANode :: collect_length
Collect the length (inChar
) of the node.
nitc :: ANode :: collect_tokens_by_text
Do a deep search and return an array of tokens that match a given textnitc :: ANode :: common_parent
The most specific common parent betweenself
and other
nitc :: AExpr :: comprehension
Is non-null ifself
is a leaf of a comprehension array construction.
nitc :: AExpr :: comprehension=
Is non-null ifself
is a leaf of a comprehension array construction.
nitc :: ANode :: create_contracts
nitc :: ANode :: decorate_tag
Add aditionnal information on a child-token and return an additionnal HInfoBox on itcore :: Object :: defaultinit
nitc :: AExpr :: defaultinit
core :: Cloneable :: defaultinit
nitc :: Prod :: defaultinit
nitc :: ANode :: defaultinit
nitc :: AAttrFormExpr :: defaultinit
nitc :: AExpr :: detach_with_placeholder
Thedetach
method completely remove the node in the parent.
nitc :: ANode :: do_cloneable
nitc :: Prod :: first_location
Location on the first token after the start of a productionnitc :: Prod :: first_location=
Location on the first token after the start of a productionnitc :: Prod :: first_token
The first token of the production in the ASTnitc :: Prod :: first_token=
The first token of the production in the ASTnitc :: ANode :: force_block=
Forceself
to be rendered as a block.
nitc :: ANode :: force_inline=
Forceself
to be rendered as a line.
nitc :: ANode :: full_transform_visitor
nitc :: AExpr :: generate_basic_blocks
Generate recursively basic block for this expressionnitc :: Prod :: get_annotations
Return all its annotations of a given name in the order of their declarationnitc :: Prod :: get_single_annotation
Try to get its single annotation with a given namenitc :: ANode :: hot_location
The location of the important part of the node (identifier or whatever)nitc :: AAttrFormExpr :: id=
Identifier of the class which introduced the attributenitc :: AExpr :: implicit_cast_to
If required, the following implicit cast.as(XXX)
nitc :: AExpr :: implicit_cast_to=
If required, the following implicit cast.as(XXX)
nitc :: ANode :: is_broken=
The indication that the node did not pass some semantic verifications.nitc :: ANode :: is_noserialize
Is this node annotated to not be made serializable?core :: Object :: is_same_instance
Return true ifself
and other
are the same instance (i.e. same identity).
core :: Object :: is_same_serialized
Isself
the same as other
in a serialization context?
core :: Object :: is_same_type
Return true ifself
and other
have the same dynamic type.
nitc :: ANode :: is_serialize
Is this node annotated to be made serializable?nitc :: ANode :: is_structural
Isself
a token or a pure-structural production like AQId
?
nitc :: Prod :: last_token
The last token of the production in the ASTnitc :: Prod :: last_token=
The last token of the production in the ASTnitc :: AExpr :: make_var_read
Return a new variable read that contains the value of the expressionnitc :: AAttrFormExpr :: mproperty=
The attribute accessed.nitc :: ANode :: must_be_block
Doesself
have to be rendered as a block?
nitc :: ANode :: must_be_inline
Doesself
have be rendered as a line?
nitc :: Prod :: n_annotations
All the annotations attached directly to the nodenitc :: Prod :: n_annotations=
All the annotations attached directly to the nodecore :: Object :: native_class_name
The class name of the object in CString format.nitc :: AAttrFormExpr :: offset=
Position of the attribute in attribute tablenitc :: AAttrFormExpr :: optimize
Optimize this attribute accesscore :: Object :: output_class_name
Display class name on stdout (debug only).nitc :: ANode :: parentize_tokens
Visit the AST and computes advanced AST attributes on Tokens and Prodnitc :: ANode :: replace_child
Replace a child with an other node in the ASTnitc :: ANode :: replace_with
Replace itself with an other node in the ASTnitc :: AAttrFormExpr :: resolve_property
Resolve the attribute accessed.nitc :: Prod :: start_token
The token where the production really start (skipping ADoc).nitc :: AAttrFormExpr :: status
Indicate the status of the optimization for this nodenitc :: AAttrFormExpr :: status=
Indicate the status of the optimization for this nodenitc :: AExpr :: vararg_decl
It indicates the number of arguments collected as a vararg.nitc :: AExpr :: vararg_decl=
It indicates the number of arguments collected as a vararg.nitc :: AExpr :: variable_cache
nitc :: AExpr :: variable_cache=
nitc :: AExpr :: warn_parentheses
Warn in case of superfluous parenthesesnitc :: ANode :: was_inline
Doesself
was written in one line before transformation?
redef class AAttrFormExpr
# The attribute accessed.
var mproperty: nullable MAttribute
# The static type of the attribute.
var attr_type: nullable MType
# Resolve the attribute accessed.
private fun resolve_property(v: TypeVisitor)
do
var recvtype = v.visit_expr(self.n_expr)
if recvtype == null then return # Skip error
var node = self.n_id
var name = node.text
if recvtype isa MNullType then
v.error(node, "Error: attribute `{name}` access on `null`.")
return
end
var unsafe_type = v.anchor_to(recvtype)
var mproperty = v.try_get_mproperty_by_name2(node, unsafe_type, name)
if mproperty == null then
v.modelbuilder.error(node, "Error: attribute `{name}` does not exist in `{recvtype}`.")
return
end
assert mproperty isa MAttribute
self.mproperty = mproperty
var mpropdefs = mproperty.lookup_definitions(v.mmodule, unsafe_type)
assert mpropdefs.length == 1
var mpropdef = mpropdefs.first
var attr_type = mpropdef.static_mtype
if attr_type == null then return # skip error
attr_type = v.resolve_for(attr_type, recvtype, self.n_expr isa ASelfExpr)
self.attr_type = attr_type
end
redef fun dump_info(v) do
var res = super
var mproperty = self.mproperty
var attr_type = self.attr_type
if mproperty != null then
res += v.yellow(" attr={mproperty}:{attr_type or else "BROKEN"}")
end
return res
end
end
src/semantize/typing.nit:2488,1--2534,3
redef class AAttrFormExpr
# Position of the attribute in attribute table
#
# The relative position of this attribute if perfect hashing is used,
# The absolute position of this attribute if SST is used
var offset: Int
# Indicate the status of the optimization for this node
#
# 0: default value
# 1: SST (direct access) can be used
# 2: PH (multiple inheritance implementation) must be used
var status: Int = 0
# Identifier of the class which introduced the attribute
var id: Int
# Optimize this attribute access
# * `mproperty` The attribute which is accessed
# * `recv` The receiver (The object) of the access
protected fun optimize(mproperty: MAttribute, recv: MutableInstance)
do
var position = recv.mtype.as(MClassType).mclass.get_position_attributes(mproperty.intro_mclassdef.mclass)
if position > 0 then
# if this attribute class has an unique position for this receiver, then use direct access
offset = position + mproperty.offset
status = 1
else
# Otherwise, perfect hashing must be used
id = mproperty.intro_mclassdef.mclass.vtable.id
offset = mproperty.offset
status = 2
end
end
end
src/vm/vm_optimizations.nit:54,1--88,3