From 1ccede838295a8e20a8c7016bb8201d5303fd339 Mon Sep 17 00:00:00 2001 From: Lars HVam Date: Sat, 18 Jul 2026 19:23:53 +0200 Subject: [PATCH] has --- src/zcl_mjs.clas.abap | 8 ++++++-- src/zcl_mjs_env.clas.abap | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/zcl_mjs.clas.abap b/src/zcl_mjs.clas.abap index 2931be2..92d0520 100644 --- a/src/zcl_mjs.clas.abap +++ b/src/zcl_mjs.clas.abap @@ -601,10 +601,14 @@ CLASS zcl_mjs IMPLEMENTATION. IF -slot_ok = abap_true AND io_env->slot_map IS BOUND. READ TABLE io_env->slots INDEX -slot INTO rs_val. ELSE. - IF io_env->has( -str ) = abap_false. + DATA lv_ident_found TYPE abap_bool. + io_env->resolve( + EXPORTING iv_name = -str + IMPORTING ev_found = lv_ident_found + es_val = rs_val ). + IF lv_ident_found = abap_false. raise_ref_error( -str ). ENDIF. - rs_val = io_env->get( -str ). ENDIF. WHEN zif_mjs=>c_node_binop. diff --git a/src/zcl_mjs_env.clas.abap b/src/zcl_mjs_env.clas.abap index 6c7d028..ee8547d 100644 --- a/src/zcl_mjs_env.clas.abap +++ b/src/zcl_mjs_env.clas.abap @@ -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. @@ -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(). + IF sy-subrc = 0. + READ TABLE lo_cur->slots INDEX -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(). + IF sy-subrc = 0. + es_val = -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.