This page explains how a label in imported source is evaluated from host source.
Context
The import directive doesn't literally include the imported file as-is. The rationale is explained in the user guide.
In particular, host and imported source remains encoded independently. So, a same label name can a have different id in each. Reconcile that for each label would be far too slow, and rather unnecessary. On the other hand, we have to convert id to access a specific imported label.
The assembly is very fast since it only deals with ids, not names. And a label only defined in imported source won't be seen by host source. As for FF Alpha 7, that leads to "undefined label". In this case, before returning the error, we want to try to find if the label is in one of the important source (if it is present in more than one, that's another error: ambiguous label).
Relevant routines
They will be used by asseva.o:
- When a label is not defined is current source.
- [todo] For full qualifation.
In pseudo code:
eval_label_in_import(name, import_id):
; In: name= name of label (nt string)
; import_id = source # of import (from 0 to 31)
;Out: label value (with flags, e.g. possibly undefined/undeclared/other error)
; Needed by eval_label_in_any_import()
; Will also be needed when full qualification is available
; e.g. CRTC.SET(12, &10)
; since in this case we'll know which imported file to check.
host = get_current_source_id()
org_connect_source(import_id)
id = get_id_from_name(name)
res = get_value(id)
; Reconnect host
org_connect_source(import_id)
return res
eval_label_in_any_import(id):
; In: name= id of label (in host source)
;Out: label value (with flags, e.g. possibly undefined/undeclared/other error)
res = None ; Flag to no result found yet
name = get_name_from(id)
for import_id in [0:max_source_id]:
; Only checks for sources that are actually imported
if is_dependency(import_id):
tmp = eval_label_in_import()
if is_declared(tmp):
if res is None:
res = tmp
else:
exit_error("Defined in both %s and %s" % [get_source_id(tmp), get_source_id(res)])
return res