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)+");")
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)+")"
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
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
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);
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);
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) + ");")
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)