Exemplo n.º 1
0
  void put(Scriptable scope, String name, Object javaObject, Object value, boolean isStatic) {
    Map<String, Object> ht = isStatic ? staticMembers : members;
    Object member = ht.get(name);
    if (!isStatic && member == null) {
      // Try to get static member from instance (LC3)
      member = staticMembers.get(name);
    }
    if (member == null) throw reportMemberNotFound(name);
    if (member instanceof FieldAndMethods) {
      FieldAndMethods fam = (FieldAndMethods) ht.get(name);
      member = fam.field;
    }

    // Is this a bean property "set"?
    if (member instanceof BeanProperty) {
      BeanProperty bp = (BeanProperty) member;
      if (bp.setter == null) {
        throw reportMemberNotFound(name);
      }
      // If there's only one setter or if the value is null, use the
      // main setter. Otherwise, let the NativeJavaMethod decide which
      // setter to use:
      if (bp.setters == null || value == null) {
        Class<?> setType = bp.setter.argTypes[0];
        Object[] args = {Context.jsToJava(value, setType)};
        try {
          bp.setter.invoke(javaObject, args);
        } catch (Exception ex) {
          throw Context.throwAsScriptRuntimeEx(ex);
        }
      } else {
        Object[] args = {value};
        bp.setters.call(
            Context.getContext(), ScriptableObject.getTopLevelScope(scope), scope, args);
      }
    } else {
      if (!(member instanceof Field)) {
        String str = (member == null) ? "msg.java.internal.private" : "msg.java.method.assign";
        throw Context.reportRuntimeError1(str, name);
      }
      Field field = (Field) member;
      Object javaValue = Context.jsToJava(value, field.getType());
      try {
        field.set(javaObject, javaValue);
      } catch (IllegalAccessException accessEx) {
        if ((field.getModifiers() & Modifier.FINAL) != 0) {
          // treat Java final the same as JavaScript [[READONLY]]
          return;
        }
        throw Context.throwAsScriptRuntimeEx(accessEx);
      } catch (IllegalArgumentException argEx) {
        throw Context.reportRuntimeError3(
            "msg.java.internal.field.type",
            value.getClass().getName(),
            field,
            javaObject.getClass().getName());
      }
    }
  }
Exemplo n.º 2
0
 public static Object convertResult(Object result, Class<?> c) {
   if (result == Undefined.instance
       && (c != ScriptRuntime.ObjectClass && c != ScriptRuntime.StringClass)) {
     // Avoid an error for an undefined value; return null instead.
     return null;
   }
   return Context.jsToJava(result, c);
 }
Exemplo n.º 3
0
  @Nullable
  private static String lintIt(Context context, String fileName, ScriptableObject scope)
      throws IOException {
    if (Boolean.valueOf(System.getProperty("test.lint.skip"))) {
      return null;
    }

    Object[] args = {FileUtil.loadFile(new File(fileName), true), JSHINT_OPTIONS};
    Function function = (Function) ScriptableObject.getProperty(scope.getParentScope(), "JSHINT");
    Object status = function.call(context, scope.getParentScope(), scope.getParentScope(), args);
    if (!(Boolean) Context.jsToJava(status, Boolean.class)) {
      Object errors = function.get("errors", scope);
      StringBuilder sb = new StringBuilder(fileName);
      for (Object errorObj : ((NativeArray) errors)) {
        if (errorObj == null) {
          continue;
        }

        NativeObject e = (NativeObject) errorObj;
        int line = toInt(e.get("line"));
        int character = toInt(e.get("character"));
        if (line < 0 || character < 0) {
          continue;
        }
        Object reasonObj = e.get("reason");
        if (reasonObj instanceof String) {
          String reason = (String) reasonObj;
          if (IGNORED_JSHINT_WARNINGS.contains(reason)
              || reason.startsWith("Expected exactly one space between ')' and ")
              || reason.startsWith("Expected '}' to match '{' from line ")
              || reason.startsWith("Expected '{' and instead saw ")) {
            continue;
          }

          sb.append('\n').append(line).append(':').append(character).append(' ').append(reason);
        }
      }

      return sb.length() == fileName.length() ? null : sb.toString();
    }

    return null;
  }
Exemplo n.º 4
0
  Object invokeImpl(Context cx, Object target, Scriptable topScope, Method method, Object[] args) {
    int N = (args == null) ? 0 : args.length;

    Callable function = (Callable) target;
    Scriptable thisObj = topScope;
    Object[] jsargs = new Object[N + 1];
    jsargs[N] = method.getName();
    if (N != 0) {
      WrapFactory wf = cx.getWrapFactory();
      for (int i = 0; i != N; ++i) {
        jsargs[i] = wf.wrap(cx, topScope, args[i], null);
      }
    }

    Object result = function.call(cx, topScope, thisObj, jsargs);
    Class<?> javaResultType = method.getReturnType();
    if (javaResultType == Void.TYPE) {
      result = null;
    } else {
      result = Context.jsToJava(result, javaResultType);
    }
    return result;
  }
Exemplo n.º 5
0
  @Override
  public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) {
    // Find a method that matches the types given.
    if (methods.length == 0) {
      throw new RuntimeException("No methods defined for call");
    }

    int index = findFunction(cx, methods, args);
    if (index < 0) {
      Class<?> c = methods[0].method().getDeclaringClass();
      String sig = c.getName() + '.' + getFunctionName() + '(' + scriptSignature(args) + ')';
      throw Context.reportRuntimeError1("msg.java.no_such_method", sig);
    }

    MemberBox meth = methods[index];
    Class<?>[] argTypes = meth.argTypes;

    if (meth.vararg) {
      // marshall the explicit parameters
      Object[] newArgs = new Object[argTypes.length];
      for (int i = 0; i < argTypes.length - 1; i++) {
        newArgs[i] = Context.jsToJava(args[i], argTypes[i]);
      }

      Object varArgs;

      // Handle special situation where a single variable parameter
      // is given and it is a Java or ECMA array or is null.
      if (args.length == argTypes.length
          && (args[args.length - 1] == null
              || args[args.length - 1] instanceof NativeArray
              || args[args.length - 1] instanceof NativeJavaArray)) {
        // convert the ECMA array into a native array
        varArgs = Context.jsToJava(args[args.length - 1], argTypes[argTypes.length - 1]);
      } else {
        // marshall the variable parameters
        Class<?> componentType = argTypes[argTypes.length - 1].getComponentType();
        varArgs = Array.newInstance(componentType, args.length - argTypes.length + 1);
        for (int i = 0; i < Array.getLength(varArgs); i++) {
          Object value = Context.jsToJava(args[argTypes.length - 1 + i], componentType);
          Array.set(varArgs, i, value);
        }
      }

      // add varargs
      newArgs[argTypes.length - 1] = varArgs;
      // replace the original args with the new one
      args = newArgs;
    } else {
      // First, we marshall the args.
      Object[] origArgs = args;
      for (int i = 0; i < args.length; i++) {
        Object arg = args[i];
        Object coerced = Context.jsToJava(arg, argTypes[i]);
        if (coerced != arg) {
          if (origArgs == args) {
            args = args.clone();
          }
          args[i] = coerced;
        }
      }
    }
    Object javaObject;
    if (meth.isStatic()) {
      javaObject = null; // don't need an object
    } else {
      Scriptable o = thisObj;
      Class<?> c = meth.getDeclaringClass();
      for (; ; ) {
        if (o == null) {
          throw Context.reportRuntimeError3(
              "msg.nonjava.method",
              getFunctionName(),
              ScriptRuntime.toString(thisObj),
              c.getName());
        }
        if (o instanceof Wrapper) {
          javaObject = ((Wrapper) o).unwrap();
          if (c.isInstance(javaObject)) {
            break;
          }
        }
        o = o.getPrototype();
      }
    }
    if (debug) {
      printDebug("Calling ", meth, args);
    }

    Object retval = meth.invoke(javaObject, args);
    Class<?> staticType = meth.method().getReturnType();

    if (debug) {
      Class<?> actualType = (retval == null) ? null : retval.getClass();
      System.err.println(
          " ----- Returned " + retval + " actual = " + actualType + " expect = " + staticType);
    }

    Object wrapped =
        cx.getWrapFactory()
            .wrap(
                cx, scope,
                retval, staticType);
    if (debug) {
      Class<?> actualType = (wrapped == null) ? null : wrapped.getClass();
      System.err.println(" ----- Wrapped as " + wrapped + " class = " + actualType);
    }

    if (wrapped == null && staticType == Void.TYPE) {
      wrapped = Undefined.instance;
    }
    return wrapped;
  }