コンテンツフレーム起動

機能の文書化 EVALUATE_IN_STACK 文書を SAP ライブラリストラクチャに組み込む

機能

デバッグモードでスクリプトのスタックレベルを評価します。この関数の前提条件は、それぞれの評価対象スクリプトが EXECUTE メソッドにより 1 回実行されるということです。その実行は、実際のプログラム実行で呼び出されただけでもかまいません。

IMPORT パラメータ

STACK_ENTRY_NUMBER (Type I)

スタックエントリの数。番号 1 は常に最高 ( 最新) のスタックエントリです。また 1 より大きい番号は、スタック内の低い位置にあるエントリにアクセスします。

SCRIPT (Type STRING)

実行するスクリプト。ここでは変数名を入力して、その値を照会することができます。

リターンパラメータ

RESULT (Type STRING)

EVALUATE_IN_STACK を使用して照会した命令の値。

例

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.

ここでは SOURCE1.JS SOURCE2.JS という 2 つのスクリプトがコンパイルされます。SOURCE2.JS は、SOURCE1.JS Set_String 関数を呼び出します。SOURCE1.JS がスタック内で有効であるため、コンパイル後に EXECUTE メソッドにより 1 回実行される必要があります。ブレークポイントが行 1 で設定された後に、EXECUTE メソッドはSOURCE1.JS をデバッグモードに切り替えます。現在のスタックが GET_CALL_STACK メソッドにより読み取られて、内部テーブルに格納されます。SOURCE1.JS SOURCE2.JS の変数値が EVALUATE_IN_STACK メソッドにより読み取られます。値 1 STACK_ENTRY_NUMBER に転送されるので、ここではほとんどのローカルコンテキストは常に可視データと見なされます。対応するテーブルのスタック行は、変数に出力されます。スクリプト全体は、STEP_INTO メソッドにより、完了してスタックが空になるまで実行されます。

 

 

コンテンツフレーム終了