Exemple #1
0
def codeOutFunction(indent, func):
  if func["type"]=="object":
    codeOutFunctionObject(indent, func)
    return
  name = ""
  if "class" in func:
    name = name + func["class"]+".";
  name = name + func["name"]
  print name
  codeOut(indent+"// "+name+"  ("+func["filename"]+")")
  
  if ("generate" in func):
    gen_name = func["generate"]
    if re.match('^[\w_]+$', gen_name) is None:
      sys.stderr.write("ERROR: generate for '"+func["name"]+"' is not simple function name: '"+gen_name+"'\n")
      exit(1)
  else:
    sys.stderr.write("ERROR: codeOutFunction: Function '"+func["name"]+"' does not have generate, generate_full or wrap elements'\n")
    exit(1)

  if func["type"]=="variable" or common.is_property(func):     
    if hasThis(func):
      gen_name = gen_name+"(parent)"
    else:
      gen_name = gen_name+"()";

    codeOut(indent+"return "+getCreator(func["return"][0], gen_name, func["name"])+";")
  else:
    codeOut(indent+"return jsvNewNativeFunction((void (*)(void))"+gen_name+", "+getArgumentSpecifier(func)+");")
Exemple #2
0
def get_arguments(jsondata):
  if common.is_property(jsondata):
    return ""
  args = [];
  if "params" in jsondata:
    for param in jsondata["params"]:
      args.append(param[0]);
      if param[1]=="JsVarArray": args.append("...");
  return "("+", ".join(args)+")"
Exemple #3
0
def get_surround(jsondata):
  s = common.get_prefix_name(jsondata)
  if s!="": s = s + " "
  if jsondata["type"]!="constructor":
    if "class" in jsondata: s=s+jsondata["class"]+"."
  s=s+jsondata["name"]
  if not common.is_property(jsondata):
    args = [];
    if "params" in jsondata:
      for param in jsondata["params"]:
        args.append(param[0]);
        if param[1]=="JsVarArray": args.append("...");
    s=s+"("+",".join(args)+")"
  return s
Exemple #4
0
def get_surround(jsondata):
    s = common.get_prefix_name(jsondata)
    if s != "": s = s + " "
    if jsondata["type"] != "constructor":
        if "class" in jsondata: s = s + jsondata["class"] + "."
    s = s + jsondata["name"]
    if not common.is_property(jsondata):
        args = []
        if "params" in jsondata:
            for param in jsondata["params"]:
                args.append(param[0])
                if param[1] == "JsVarArray": args.append("...")
        s = s + "(" + ",".join(args) + ")"
    return s
Exemple #5
0
def get_surround(jsondata):
  if jsondata["type"]=="constructor":
    s = "constructor "
  else:
    s = "function "
    if "class" in jsondata:
      s=s+jsondata["class"]+"."
  s=s+jsondata["name"]
  if not common.is_property(jsondata):
    args = [];
    if "params" in jsondata:
      for param in jsondata["params"]:
        args.append(param[0]);
    s=s+"("+",".join(args)+")"
  return s
def getArgumentSpecifier(jsondata):
  params = getParams(jsondata)
  result = getResult(jsondata);
  s = [ toArgumentType(result[0]) ]
  if hasThis(jsondata): s.append("JSWAT_THIS_ARG");
  # Either it's a variable/property, in which case we need to execute the native function in order to return the correct info
  if jsondata["type"]=="variable" or common.is_property(jsondata): 
    s.append("JSWAT_EXECUTE_IMMEDIATELY")
  # Or it's an object, in which case the native function contains code that creates it - and that must be executed too. 
  # It also returns JsVar
  if jsondata["type"]=="object":
    s = [ toArgumentType("JsVar"), "JSWAT_EXECUTE_IMMEDIATELY" ]

  n = 1
  for param in params:
    s.append("("+toArgumentType(param[1])+" << (JSWAT_BITS*"+str(n)+"))");
    n=n+1
  return " | ".join(s);
Exemple #7
0
def getArgumentSpecifier(jsondata):
  params = getParams(jsondata)
  result = getResult(jsondata);
  s = [ toArgumentType(result[0]) ]
  if hasThis(jsondata): s.append("JSWAT_THIS_ARG");
  # Either it's a variable/property, in which case we need to execute the native function in order to return the correct info
  if jsondata["type"]=="variable" or common.is_property(jsondata): 
    s.append("JSWAT_EXECUTE_IMMEDIATELY")
  # Or it's an object, in which case the native function contains code that creates it - and that must be executed too. 
  # It also returns JsVar
  if jsondata["type"]=="object":
    s = [ toArgumentType("JsVar"), "JSWAT_EXECUTE_IMMEDIATELY" ]

  n = 1
  for param in params:
    s.append("("+toArgumentType(param[1])+" << (JSWAT_BITS*"+str(n)+"))");
    n=n+1
  return " | ".join(s);
Exemple #8
0
def getArgumentSpecifier(jsondata):
  params = getParams(jsondata)
  result = getResult(jsondata);
  s = [ toArgumentType(result[0]) ]
  if hasThis(jsondata): s.append("JSWAT_THIS_ARG");
  # Either it's a variable/property, in which case we need to execute the native function in order to return the correct info
  if jsondata["type"]=="variable" or common.is_property(jsondata):
    s.append("JSWAT_EXECUTE_IMMEDIATELY")
  # Or it's an object, in which case the native function contains code that creates it - and that must be executed too.
  # It also returns JsVar
  if jsondata["type"]=="object":
    s = [ toArgumentType("JsVar"), "JSWAT_EXECUTE_IMMEDIATELY" ]

  n = 1
  for param in params:
    s.append("("+toArgumentType(param[1])+" << (JSWAT_BITS*"+str(n)+"))");
    n=n+1
  if n>5:
    sys.stderr.write("ERROR: getArgumentSpecifier: Too many arguments to fit in type specifier, Use JsVarArray\n")
    sys.stderr.write(json.dumps(jsondata, sort_keys=True, indent=2)+"\n")
    exit(1)

  return " | ".join(s);
Exemple #9
0
def codeOutFunction(indent, func):
    if func["type"] == "object":
        codeOutFunctionObject(indent, func)
        return
    name = ""
    if "class" in func:
        name = name + func["class"] + "."
    name = name + func["name"]
    #  print name
    codeOut(indent + "// " + name + "  (" + func["filename"] + ")")
    codeOut(indent + "// " + getCDeclaration(func, name))

    if ("generate" in func):
        gen_name = func["generate"]
        if re.match('^[\w_]+$', gen_name) is None:
            sys.stderr.write("ERROR: generate for '" + func["name"] +
                             "' is not simple function name: '" + gen_name +
                             "'\n")
            exit(1)
    else:
        sys.stderr.write(
            "ERROR: codeOutFunction: Function '" + func["name"] +
            "' does not have generate, generate_full or wrap elements'\n")
        exit(1)

    if func["type"] == "variable" or common.is_property(func):
        if hasThis(func):
            gen_name = gen_name + "(parent)"
        else:
            gen_name = gen_name + "()"

        codeOut(indent + "return " +
                getCreator(func["return"][0], gen_name, func["name"]) + ";")
    else:
        codeOut(indent + "return jsvNewNativeFunction((void (*)(void))" +
                gen_name + ", " + getArgumentSpecifier(func) + ");")
Exemple #10
0
def codeOutFunction(indent, func):
  if func["type"]=="object":
    codeOutFunctionObject(indent, func)
    return
  name = ""
  if "class" in func:
    name = name + func["class"]+".";
  name = name + func["name"]
  print name
  codeOut(indent+"// "+name+"  ("+func["filename"]+")")
  hasThis = func["type"]=="property" or func["type"]=="method"
  if ("generate" in func) or ("generate_full" in func):
    argNames = ["a","b","c","d"];
    params = []
    if "params" in func: params = func["params"]

    if len(params)==0: 
      if func["type"]=="variable" or common.is_property(func):
        codeOut(indent+"jspParseVariableName();")
      else:
        codeOut(indent+"jspParseEmptyFunction();")
    elif len(params)==1 and params[0][1]=="JsVarArray": 
      codeOut(indent+"JsVar *"+params[0][0]+" = jspParseFunctionAsArray();")
      codeOut(indent+"if (!"+params[0][0]+") return 0; // if parse error")
    elif len(params)==1 and params[0][1]!="JsVarName": 
      codeOut(indent+"JsVar *"+params[0][0]+" = jspParseSingleFunction();")
    elif len(params)<9:
      funcName = "jspParseFunction8"
      paramCount = 8
      if len(params)<5:  
        funcName = "jspParseFunction"
        paramCount = 4
      paramDefs = []
      paramPtrs = []
      skipNames = "0"
      n = 0
      letters = ["A","B","C","D","E","F","G","H"];
      for param in params:
        paramDefs.append("*"+param[0])
        paramPtrs.append("&"+param[0])
        if param[1]=="JsVarName": skipNames = skipNames + "|JSP_NOSKIP_"+letters[n]
        n = n + 1
      while len(paramPtrs)<paramCount: paramPtrs.append("0")
      codeOut(indent+"JsVar "+', '.join(paramDefs)+";");
      codeOut(indent+funcName+"("+skipNames+", "+', '.join(paramPtrs)+");");
    else:
      print "ERROR: codeOutFunction unknown number of args "+str(len(params))
      exit(1)

    if "generate" in func:
      commandargs = [];
      if hasThis:      
        commandargs.append("parent")
      if "needs_parentName" in func:
        commandargs.append("parentName")
      for param in params:
        if param[1]=="JsVar" or param[1]=="JsVarName" or param[1]=="JsVarArray":
          commandargs.append(param[0]);
        else:
          commandargs.append(getUnLockGetter(param[1], param[0], func["name"]));
      command = func["generate"]+"("+ ', '.join(commandargs) +")";
    else:	
      command = func["generate_full"];
    
    if "return" in func: 
      codeOut(indent+"JsVar *_r = " + getCreator(func["return"][0], command, func["name"])+";");
    else:
      codeOut(indent+command+";");

    # note: generate_full doesn't use commandargs, so doesn't unlock
    for param in params:
      if "generate_full" in func or param[1]=="JsVar" or param[1]=="JsVarName" or param[1]=="JsVarArray":
        codeOut(indent+"jsvUnLock("+param[0]+");");

    if "return" in func: 
      codeOut(indent+"return _r;");
    else:
      codeOut(indent+"return 0;");
  elif "wrap" in func:
    codeOut(indent+"return "+func["wrap"]+"(parent, parentName);")
  else:
    sys.stderr.write("ERROR: codeOutFunction: Function '"+func["name"]+"' does not have generate, generate_full or wrap elements'\n")
    exit(1)