Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions src/zcl_mjs.clas.abap
Original file line number Diff line number Diff line change
Expand Up @@ -601,10 +601,14 @@ CLASS zcl_mjs IMPLEMENTATION.
IF <n>-slot_ok = abap_true AND io_env->slot_map IS BOUND.
READ TABLE io_env->slots INDEX <n>-slot INTO rs_val.
ELSE.
IF io_env->has( <n>-str ) = abap_false.
DATA lv_ident_found TYPE abap_bool.
io_env->resolve(
EXPORTING iv_name = <n>-str
IMPORTING ev_found = lv_ident_found
es_val = rs_val ).
IF lv_ident_found = abap_false.
raise_ref_error( <n>-str ).
ENDIF.
rs_val = io_env->get( <n>-str ).
ENDIF.

WHEN zif_mjs=>c_node_binop.
Expand Down
39 changes: 39 additions & 0 deletions src/zcl_mjs_env.clas.abap
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ CLASS zcl_mjs_env DEFINITION PUBLIC.
METHODS get
IMPORTING iv_name TYPE string
RETURNING VALUE(rs_val) TYPE zif_mjs=>ty_value.
" Resolve a variable in one scope-chain walk, returning existence and value
METHODS resolve
IMPORTING iv_name TYPE string
EXPORTING ev_found TYPE abap_bool
es_val TYPE zif_mjs=>ty_value.
METHODS set
IMPORTING iv_name TYPE string
is_val TYPE zif_mjs=>ty_value.
Expand Down Expand Up @@ -83,6 +88,40 @@ CLASS zcl_mjs_env IMPLEMENTATION.
rs_val-type = zif_mjs=>c_type_undefined. " undefined
ENDMETHOD.

METHOD resolve.
DATA lo_cur TYPE REF TO zcl_mjs_env.
lo_cur = me.
ev_found = abap_false.
CLEAR es_val.

WHILE lo_cur IS BOUND.
IF lo_cur->slot_map IS BOUND.
READ TABLE lo_cur->slot_map->* WITH TABLE KEY name = iv_name
ASSIGNING FIELD-SYMBOL(<sm>).
IF sy-subrc = 0.
READ TABLE lo_cur->slots INDEX <sm>-slot INTO es_val.
IF sy-subrc <> 0.
es_val-type = zif_mjs=>c_type_undefined.
ENDIF.
ev_found = abap_true.
RETURN.
ENDIF.
ENDIF.

READ TABLE lo_cur->vars WITH TABLE KEY name = iv_name
ASSIGNING FIELD-SYMBOL(<v>).
IF sy-subrc = 0.
es_val = <v>-val.
ev_found = abap_true.
RETURN.
ENDIF.

lo_cur = lo_cur->parent.
ENDWHILE.

es_val-type = zif_mjs=>c_type_undefined.
ENDMETHOD.

METHOD has.
IF slot_map IS BOUND.
READ TABLE slot_map->* WITH TABLE KEY name = iv_name TRANSPORTING NO FIELDS.
Expand Down
Loading