//
//   Copyright 2018  SenX S.A.S.
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//

package io.warp10.script.functions;

import io.warp10.script.NamedWarpScriptFunction;
import io.warp10.script.WarpScriptStackFunction;
import io.warp10.script.WarpScriptException;
import io.warp10.script.WarpScriptStack;

public class RUN extends NamedWarpScriptFunction implements WarpScriptStackFunction {
  
  public RUN(String name) {
    super(name);
  }
  
  @Override
  public Object apply(WarpScriptStack stack) throws WarpScriptException {
    Object symbol = stack.pop();
    
    if (!(symbol instanceof String)) {
      throw new WarpScriptException(getName() + " expects macro name to be a string.");
    }
    
    stack.run(symbol.toString());
    
    return stack;
  }
}

@@ -697,57 +697,8 @@
 on;%0A
-import io.warp10.script.WarpScriptStackFunction;%0A
 impo
@@ -778,16 +778,65 @@
 ptStack;
+%0Aimport io.warp10.script.WarpScriptStackFunction;
 %0A%0Apublic
@@ -915,18 +915,16 @@
 ction %7B%0A
-  
 %0A  publi
@@ -965,18 +965,16 @@
 e);%0A  %7D%0A
-  
 %0A  @Over
@@ -1089,52 +1089,328 @@
 ();%0A
+%0A
     
-%0A    if (!(symbol instanceof String)) %7B%0A
+if (symbol instanceof String) %7B%0A      stack.run(symbol.toString());%0A    %7D else if (symbol instanceof Long %7C%7C symbol instanceof Integer) %7B%0A      Object reg = stack.load(((Number) symbol).intValue());%0A      if (reg instanceof WarpScriptStack.Macro) %7B%0A        stack.exec((WarpScriptStack.Macro) reg);%0A      %7D else %7B%0A  
     
@@ -1467,38 +1467,64 @@
 cts 
-macro name to be a string
+register number %22 + symbol + %22 to contain a macro
 .%22);%0A
+  
     
@@ -1533,47 +1533,139 @@
     
-%0A    stack.run(symbol.toString()
+%7D else %7B%0A      throw new WarpScriptException(getName() + %22 expects macro name to be a STRING or a register number (LONG).%22
 );%0A    
+%7D%0A
 %0A   

Allow RUN to use registers