Anfang des Inhaltsbereichs

Funktionsdokumentation EVALUATE_IN_STACK  Dokument im Navigationsbaum lokalisieren

Funktion

Wertet im Debugging-Modus ein Skript einer bestimmten Stack-Stufe aus. Voraussetzung dafür ist, dass jedes auszuwertende Skript einmal mit der Methode EXECUTE ausgeführt wurde, selbst wenn es in der tatsächlichen Programmausführung nur aufgerufen wird.

Importing Parameter

STACK_ENTRY_NUMBER (Typ I)

Nummer des Stack-Eintrags. Die Nummer 1 ist immer der höchste (aktuellste) Stack-Eintrag, während Zahlen größer 1 auf tiefer liegende Einträge zugreifen.

SCRIPT (Typ STRING)

Auszuwertendes Skript. Hier können die Namen von Variablen eingegeben und dadurch ihr Wert abgefragt werden.

Returning Parameter

RESULT (Typ STRING)

Wert der durch EVALUATE_IN_STACK abgefragten Anweisung.

Beispiel

Beispiel

report DEMO_JAVA_SCRIPT_STEP.

data SOURCE1 type STRING.
data SOURCE2 type STRING.
data VALUE_GLOBAL type STRING.
data VALUE_LOCAL  type STRING.

data JS_PROCESSOR type ref to CL_JAVA_SCRIPT.
data STACK type JS_STACK_TABLE.

data STACK_ENTRY like line of STACK.
data STACK_DEPTH type I.

JS_PROCESSOR = CL_JAVA_SCRIPT=>CREATE( ).

concatenate
  'function Set_String()          ' " 1
  '{                              ' " 2
  '  var local = "";              ' " 3
  '  local += " this";            ' " 4
  '  local += " is";              ' " 5
  '  local += " JavaScript";      ' " 6
  '  global = global + local;     ' " 7
  '  global += "!";               ' " 8
  '}                              ' " 9
   into SOURCE1 separated by CL_ABAP_CHAR_UTILITIES=>CR_LF.

concatenate
  'var global = "Hello World,";   ' " 1
  'Set_String();                  ' " 2
  'string;                        ' " 3
   into SOURCE2 separated by CL_ABAP_CHAR_UTILITIES=>CR_LF.

JS_PROCESSOR->COMPILE(
    SCRIPT_NAME = 'SOURCE1.JS'
    SCRIPT      = SOURCE1 ).

JS_PROCESSOR->EXECUTE( exporting SCRIPT_NAME = 'SOURCE1.JS' ).

JS_PROCESSOR->COMPILE(
    SCRIPT_NAME = 'SOURCE2.JS'
    SCRIPT      = SOURCE2 ).

JS_PROCESSOR->SET_BREAKPOINT(
    SCRIPT_NAME = 'SOURCE2.JS'
    LINE_NUMBER = 1 ).

JS_PROCESSOR->EXECUTE( exporting SCRIPT_NAME = 'SOURCE2.JS' ).

if JS_PROCESSOR->LAST_CONDITION_CODE =
                 CL_JAVA_SCRIPT=>CC_BREAKPOINT.
  STACK = JS_PROCESSOR->GET_CALL_STACK( ).
  STACK_DEPTH = LINES( STACK ).
endif.

while STACK_DEPTH > 0.

  read table STACK into STACK_ENTRY index 1.

  VALUE_GLOBAL = JS_PROCESSOR->EVALUATE_IN_STACK(
                 STACK_ENTRY_NUMBER = 1 SCRIPT = 'global' ).
  VALUE_LOCAL  = JS_PROCESSOR->EVALUATE_IN_STACK(
                 STACK_ENTRY_NUMBER = 1 SCRIPT = 'local' ).

  write: at /(3) STACK_ENTRY-LINE_NUMBER,
         at 10   STACK_ENTRY-SCRIPT_NAME,
         at 25   STACK_ENTRY-FUNCTION_NAME,
         at 40   VALUE_GLOBAL,
         at 75   VALUE_LOCAL.

  JS_PROCESSOR->STEP_INTO( ).

  STACK = JS_PROCESSOR->GET_CALL_STACK( ).
  STACK_DEPTH = LINES( STACK ).

endwhile.

Hier werden zwei Skripte, SOURCE1.JS und SOURCE2.JS kompiliert. SOURCE2.JS ruft die Funktion Set_String in SOURCE1.JS auf. Damit SOURCE1.JS aktiv im Stack vorhanden ist, muß es nach der Kompilierung einmal mit der Methode EXECUTE ausgeführt werden. Nachdem Setzen eines Breakpoints in Zeile 1 überführt die Methode EXECUTE SOURCE1.JS in den Debugging-Modus. Mit der Methode GET_CALL_STACK wird der aktuelle Stack in eine interne Tabelle gelesen. Mit der Methode EVALUATE_IN_STACK werden die Werte der Variablen aus SOURCE1.JS und SOURCE2.JS ausgelesen. Da der Wert 1 für STACK_ENTRY_NUMBER übergeben wird, wird immer der lokalste Kontext mit den dort sichtbaren Daten betrachtet. Die entsprechende Tabellenzeile des Stacks wird mit den Variablen ausgegeben. Mit der Methode STEP_INTO wird das gesamte Skript durchlaufen, bis seine Ausführung beendet und der Stack leer ist.