Manual_Container.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. // Copyright (c) 2008-2023 the Urho3D project
  2. // License: MIT
  3. #include "../Precompiled.h"
  4. #include "../AngelScript/APITemplates.h"
  5. namespace Urho3D
  6. {
  7. // This function is called before ASRegisterGenerated()
  8. void ASRegisterManualFirst_Container(asIScriptEngine* engine)
  9. {
  10. }
  11. // ========================================================================================
  12. static String& StringAssignInt(int value, String& str)
  13. {
  14. str = String(value);
  15. return str;
  16. }
  17. static String StringAddInt(int value, const String& str)
  18. {
  19. return str + String(value);
  20. }
  21. static String StringAddIntReverse(int value, const String& str)
  22. {
  23. return String(value) + str;
  24. }
  25. static String& StringAssignUInt(unsigned value, String& str)
  26. {
  27. str = String(value);
  28. return str;
  29. }
  30. static String StringAddUInt(unsigned value, const String& str)
  31. {
  32. return str + String(value);
  33. }
  34. static String StringAddUIntReverse(unsigned value, const String& str)
  35. {
  36. return String(value) + str;
  37. }
  38. static String& StringAssignFloat(float value, String& str)
  39. {
  40. str = String(value);
  41. return str;
  42. }
  43. static String StringAddFloat(float value, const String& str)
  44. {
  45. return str + String(value);
  46. }
  47. static String StringAddFloatReverse(float value, const String& str)
  48. {
  49. return String(value) + str;
  50. }
  51. static String& StringAssignDouble(double value, String& str)
  52. {
  53. str = String(value);
  54. return str;
  55. }
  56. static String& StringAddAssignDouble(double value, String& str)
  57. {
  58. str += String(value);
  59. return str;
  60. }
  61. static String StringAddDouble(double value, const String& str)
  62. {
  63. return str + String(value);
  64. }
  65. static String StringAddDoubleReverse(double value, const String& str)
  66. {
  67. return String(value) + str;
  68. }
  69. static String& StringAssignBool(bool value, String& str)
  70. {
  71. str = String(value);
  72. return str;
  73. }
  74. static String StringAddBool(bool value, const String& str)
  75. {
  76. return str + String(value);
  77. }
  78. static String StringAddBoolReverse(bool value, const String& str)
  79. {
  80. return String(value) + str;
  81. }
  82. struct as_unkn_arg
  83. {
  84. void* val;
  85. int typeId;
  86. };
  87. static bool isFirstNameSymbol(char s) { return (s >= 'A' && s <= 'Z') || (s >= 'a' && s <= 'z') || s == '_'; }
  88. static bool isNameSymbol(char s) { return isFirstNameSymbol(s) || (s >= '0' && s <= '9'); }
  89. static String strFromSprintf(const char* buffer, int len) { return {buffer, len > 0 ? len : 0}; }
  90. static void findVariable(asIScriptContext* context, const String& varName, void*& var, int& typeId)
  91. {
  92. int thisTypeId = context->GetThisTypeId();
  93. if (varName == "this")
  94. {
  95. if (thisTypeId > 0)
  96. {
  97. typeId = thisTypeId;
  98. var = context->GetThisPointer();
  99. }
  100. return;
  101. }
  102. // Search in local vars
  103. for (int idx = 0, varCount = context->GetVarCount(); idx < varCount; idx++)
  104. {
  105. const char* contextVarName = nullptr;
  106. context->GetVar(idx, 0, &contextVarName, &typeId);
  107. if (varName == contextVarName && context->IsVarInScope(idx, 0))
  108. {
  109. var = context->GetAddressOfVar(idx);
  110. return;
  111. }
  112. }
  113. // Try in member vars
  114. if (thisTypeId > 0)
  115. {
  116. asITypeInfo* typeInfo = context->GetEngine()->GetTypeInfoById(thisTypeId);
  117. for (int idx = 0, propCount = typeInfo->GetPropertyCount(); idx < propCount; idx++)
  118. {
  119. const char* name;
  120. typeInfo->GetProperty(idx, &name, &typeId);
  121. if (varName == name)
  122. {
  123. var = reinterpret_cast<asIScriptObject*>(context->GetThisPointer())->GetAddressOfProperty(idx);
  124. return;
  125. }
  126. }
  127. }
  128. // Try global vars
  129. asIScriptModule* mod = context->GetFunction(0)->GetModule();
  130. int varIdx = mod->GetGlobalVarIndexByName(varName.CString());
  131. if (varIdx >= 0)
  132. {
  133. mod->GetGlobalVar(varIdx, nullptr, nullptr, &typeId);
  134. var = mod->GetAddressOfGlobalVar(varIdx);
  135. return;
  136. }
  137. }
  138. static void convertToString(void* object, asIScriptContext* context, int typeId, String& result)
  139. {
  140. asITypeInfo* typeInfo = context->GetEngine()->GetTypeInfoById(typeId);
  141. if (!typeInfo)
  142. {
  143. result = "[error]";
  144. return;
  145. }
  146. bool isMemberFunc = true;
  147. asIScriptFunction* pFunc = typeInfo->GetMethodByDecl("String ToString()const");
  148. if (!pFunc)
  149. pFunc = typeInfo->GetMethodByDecl("String opImplConv()const");
  150. if (!pFunc)
  151. pFunc = typeInfo->GetMethodByDecl("String toString()const");
  152. if (!pFunc)
  153. {
  154. isMemberFunc = false;
  155. const char* ns = typeInfo->GetNamespace();
  156. String nameOfType = (ns ? String(ns) + "::" : String()) + typeInfo->GetName();
  157. String nameOfFunc = String("String ToString(const ") + nameOfType + "&in)";
  158. pFunc = context->GetFunction()->GetModule()->GetFunctionByDecl(nameOfFunc.CString());
  159. }
  160. if (pFunc)
  161. {
  162. context->PushState();
  163. context->Prepare(pFunc);
  164. if (isMemberFunc)
  165. context->SetObject(object);
  166. else
  167. context->SetArgObject(0, object);
  168. bool success = context->Execute() == asEXECUTION_FINISHED;
  169. if (success)
  170. result = *(String*)context->GetAddressOfReturnValue();
  171. context->PopState();
  172. if (success)
  173. return;
  174. }
  175. char buf[256];
  176. result = strFromSprintf(buf, snprintf(buf, sizeof(buf), "[object %s, %p]", typeInfo->GetName(), object));
  177. }
  178. static String formatVariable(asIScriptContext* context, int stringTypeID, as_unkn_arg* args,
  179. const String& fmtStr, const String& varName, i32 argIdx)
  180. {
  181. void* val = nullptr;
  182. int valTypeId;
  183. if (!varName.Empty())
  184. findVariable(context, varName, val, valTypeId);
  185. else
  186. {
  187. val = args[argIdx].val;
  188. valTypeId = args[argIdx].typeId;
  189. }
  190. if (!val || !valTypeId)
  191. return {};
  192. const char* fmt = fmtStr.Empty() ? nullptr : fmtStr.CString();
  193. if (valTypeId & asTYPEID_MASK_OBJECT)
  194. {
  195. if (valTypeId & asTYPEID_OBJHANDLE)
  196. {
  197. val = *(void**)val;
  198. valTypeId &= ~asTYPEID_OBJHANDLE;
  199. }
  200. String tmp;
  201. if (valTypeId != stringTypeID)
  202. {
  203. convertToString(val, context, valTypeId, tmp);
  204. val = &tmp;
  205. }
  206. if (!fmt || fmtStr == "%s")
  207. return *(String*)val;
  208. char buf[1024];
  209. return strFromSprintf(buf, snprintf(buf, sizeof(buf), fmt, reinterpret_cast<String*>(val)->CString()));
  210. }
  211. if (valTypeId > asTYPEID_DOUBLE) // For enums
  212. valTypeId = asTYPEID_INT32;
  213. char buffer[256];
  214. switch (valTypeId)
  215. {
  216. case asTYPEID_BOOL:
  217. if (!fmt)
  218. return String{*(bool*)val};
  219. else
  220. return strFromSprintf(buffer, snprintf(buffer, sizeof(buffer), fmt, *(bool*)val));
  221. case asTYPEID_INT8:
  222. return strFromSprintf(buffer, snprintf(buffer, sizeof(buffer), fmt ? fmt : "%hhd", *(i8*)val));
  223. case asTYPEID_INT16:
  224. return strFromSprintf(buffer, snprintf(buffer, sizeof(buffer), fmt ? fmt : "%hd", *(i16*)val));
  225. case asTYPEID_INT32:
  226. return strFromSprintf(buffer, snprintf(buffer, sizeof(buffer), fmt ? fmt : "%d", *(i32*)val));
  227. case asTYPEID_INT64:
  228. return strFromSprintf(buffer, snprintf(buffer, sizeof(buffer), fmt ? fmt : "%lld", *(i64*)val));
  229. case asTYPEID_UINT8:
  230. return strFromSprintf(buffer, snprintf(buffer, sizeof(buffer), fmt ? fmt : "%hhx", *(u8*)val));
  231. case asTYPEID_UINT16:
  232. return strFromSprintf(buffer, snprintf(buffer, sizeof(buffer), fmt ? fmt : "%hx", *(u16*)val));
  233. case asTYPEID_UINT32:
  234. return strFromSprintf(buffer, snprintf(buffer, sizeof(buffer), fmt ? fmt : "%x", *(u32*)val));
  235. case asTYPEID_UINT64:
  236. return strFromSprintf(buffer, snprintf(buffer, sizeof(buffer), fmt ? fmt : "%llx", *(u64*)val));
  237. case asTYPEID_FLOAT:
  238. return strFromSprintf(buffer, snprintf(buffer, sizeof(buffer), fmt ? fmt : "%g", (double)*(float*)val));
  239. case asTYPEID_DOUBLE:
  240. default:
  241. return strFromSprintf(buffer, snprintf(buffer, sizeof(buffer), fmt ? fmt : "%g", *(double*)val));
  242. }
  243. }
  244. static String formatString(const String& pattern, int argsCount, as_unkn_arg* args)
  245. {
  246. asIScriptContext* context = asGetActiveContext();
  247. if (!context)
  248. return pattern;
  249. int stringTypeId = context->GetEngine()->GetStringFactoryReturnTypeId();
  250. Vector<String> parts;
  251. int curArgIdx = 0, argIdx = 0, state = 0;
  252. const char *ptr = pattern.CString(), *start = ptr, *end = ptr + pattern.Length(), *fmt = nullptr,
  253. *openCurl = nullptr, *varName = nullptr;
  254. i32 varNameLen = 0;
  255. enum states
  256. {
  257. stNone,
  258. stReadOpenCurl,
  259. stBeginIdxNum,
  260. stBeginVarName,
  261. stBeginFormat,
  262. stReadCloseCurl,
  263. };
  264. for (; ptr < end; ptr++)
  265. {
  266. char s = *ptr;
  267. switch (state)
  268. {
  269. case stNone:
  270. if (s == '{')
  271. {
  272. state = stReadOpenCurl;
  273. openCurl = ptr;
  274. }
  275. break;
  276. case stReadOpenCurl:
  277. argIdx = -1;
  278. varNameLen = 0;
  279. fmt = nullptr;
  280. if (s == '{')
  281. {
  282. parts.EmplaceBack(start, i32(ptr - start));
  283. start = ptr + 1;
  284. state = stNone;
  285. }
  286. else if (s >= '0' && s <= '9')
  287. {
  288. argIdx = s - '0';
  289. state = stBeginIdxNum;
  290. }
  291. else if (isFirstNameSymbol(s))
  292. {
  293. varName = ptr;
  294. state = stBeginVarName;
  295. }
  296. else if (s == '%')
  297. {
  298. fmt = ptr;
  299. state = stBeginFormat;
  300. }
  301. else if (s == '}')
  302. state = stReadCloseCurl;
  303. else
  304. state = stNone;
  305. break;
  306. case stBeginIdxNum:
  307. if (s >= '0' && s <= '9')
  308. argIdx = argIdx * 10 + s - '0';
  309. else if (s == '%')
  310. {
  311. fmt = ptr;
  312. state = stBeginFormat;
  313. }
  314. else if (s == '}')
  315. state = stReadCloseCurl;
  316. else
  317. state = stNone;
  318. break;
  319. case stBeginVarName:
  320. if (!isNameSymbol(s))
  321. {
  322. if (s == '%')
  323. {
  324. varNameLen = i32(ptr - varName);
  325. fmt = ptr;
  326. state = stBeginFormat;
  327. }
  328. else if (s == '}')
  329. {
  330. varNameLen = i32(ptr - varName);
  331. state = stReadCloseCurl;
  332. }
  333. else
  334. state = stNone;
  335. }
  336. break;
  337. case stBeginFormat:
  338. if (s == '}')
  339. state = stReadCloseCurl;
  340. break;
  341. }
  342. if (state == stReadCloseCurl)
  343. {
  344. state = stNone;
  345. if (!varNameLen)
  346. {
  347. if (argIdx < 0)
  348. argIdx = curArgIdx++;
  349. if (argIdx >= argsCount)
  350. continue;
  351. }
  352. if (openCurl > start)
  353. parts.EmplaceBack(start, i32(openCurl - start));
  354. start = ptr + 1;
  355. parts.EmplaceBack(formatVariable(context, stringTypeId, args, {fmt, fmt ? int(ptr - fmt) : 0},
  356. {varName, varNameLen}, argIdx));
  357. }
  358. }
  359. if (start < end)
  360. parts.EmplaceBack(start, i32(end - start));
  361. return String::Joined(parts, {});
  362. }
  363. static String format_args0(const String& pattern) { return formatString(pattern, 0, nullptr); }
  364. static String format_args1(const String& pattern, void* a1, int i1)
  365. {
  366. as_unkn_arg ua[] = {{a1, i1}};
  367. return formatString(pattern, 1, ua);
  368. }
  369. static String format_args2(const String& pattern, void* a1, int i1, void* a2, int i2)
  370. {
  371. as_unkn_arg ua[] = {{a1, i1}, {a2, i2}};
  372. return formatString(pattern, 2, ua);
  373. }
  374. static String format_args3(const String& pattern, void* a1, int i1, void* a2, int i2, void* a3, int i3)
  375. {
  376. as_unkn_arg ua[] = {{a1, i1}, {a2, i2}, {a3, i3}};
  377. return formatString(pattern, 3, ua);
  378. }
  379. static String format_args4(const String& pattern, void* a1, int i1, void* a2, int i2, void* a3, int i3, void* a4, int i4)
  380. {
  381. as_unkn_arg ua[] = {{a1, i1}, {a2, i2}, {a3, i3}, {a4, i4}};
  382. return formatString(pattern, 4, ua);
  383. }
  384. static String format_args5(const String& pattern, void* a1, int i1, void* a2, int i2, void* a3, int i3, void* a4, int i4, void* a5, int i5)
  385. {
  386. as_unkn_arg ua[] = {{a1, i1}, {a2, i2}, {a3, i3}, {a4, i4}, {a5, i5}};
  387. return formatString(pattern, 5, ua);
  388. }
  389. static String format_args6(const String& pattern, void* a1, int i1, void* a2, int i2, void* a3, int i3, void* a4, int i4, void* a5, int i5, void* a6, int i6)
  390. {
  391. as_unkn_arg ua[] = {{a1, i1}, {a2, i2}, {a3, i3}, {a4, i4}, {a5, i5}, {a6, i6}};
  392. return formatString(pattern, 6, ua);
  393. }
  394. static String format_args7(const String& pattern, void* a1, int i1, void* a2, int i2, void* a3, int i3, void* a4, int i4, void* a5, int i5, void* a6, int i6, void* a7, int i7)
  395. {
  396. as_unkn_arg ua[] = {{a1, i1}, {a2, i2}, {a3, i3}, {a4, i4}, {a5, i5}, {a6, i6}, {a7, i7}};
  397. return formatString(pattern, 7, ua);
  398. }
  399. static String format_args8(const String& pattern, void* a1, int i1, void* a2, int i2, void* a3, int i3, void* a4, int i4, void* a5, int i5, void* a6, int i6, void* a7, int i7, void* a8, int i8)
  400. {
  401. as_unkn_arg ua[] = {{a1, i1}, {a2, i2}, {a3, i3}, {a4, i4}, {a5, i5}, {a6, i6}, {a7, i7}, {a8, i8}};
  402. return formatString(pattern, 8, ua);
  403. }
  404. static String format_args9(const String& pattern, void* a1, int i1, void* a2, int i2, void* a3, int i3, void* a4, int i4, void* a5, int i5, void* a6, int i6, void* a7, int i7, void* a8, int i8, void* a9, int i9)
  405. {
  406. as_unkn_arg ua[] = {{a1, i1}, {a2, i2}, {a3, i3}, {a4, i4}, {a5, i5}, {a6, i6}, {a7, i7}, {a8, i8}, {a9, i9}};
  407. return formatString(pattern, 9, ua);
  408. }
  409. static String format_argsA(const String& pattern, void* a1, int i1, void* a2, int i2, void* a3, int i3, void* a4, int i4, void* a5, int i5, void* a6, int i6, void* a7, int i7, void* a8, int i8, void* a9, int i9, void* aA, int iA)
  410. {
  411. as_unkn_arg ua[] = {{a1, i1}, {a2, i2}, {a3, i3}, {a4, i4}, {a5, i5}, {a6, i6}, {a7, i7}, {a8, i8}, {a9, i9}, {aA, iA}};
  412. return formatString(pattern, 10, ua);
  413. }
  414. #ifdef AS_MAX_PORTABILITY
  415. static void String_Format_gen(asIScriptGeneric* gen)
  416. {
  417. int argsCount = gen->GetArgCount();
  418. Vector<as_unkn_arg> args(argsCount);
  419. for (int i = 0; i < argsCount; i++)
  420. {
  421. args[i].typeId = gen->GetArgTypeId(i);
  422. args[i].val = gen->GetArgAddress(i);
  423. }
  424. *static_cast<String*>(gen->GetAddressOfReturnLocation()) = formatString(*static_cast<String*>(gen->GetObject()), argsCount, args.Buffer());
  425. }
  426. static void Format_String_gen(asIScriptGeneric* gen)
  427. {
  428. int argsCount = gen->GetArgCount();
  429. Vector<as_unkn_arg> args(argsCount - 1);
  430. for (int i = 1; i < argsCount; i++)
  431. {
  432. args[i - 1].typeId = gen->GetArgTypeId(i);
  433. args[i - 1].val = gen->GetArgAddress(i);
  434. }
  435. *static_cast<String*>(gen->GetAddressOfReturnLocation()) = formatString(*static_cast<String*>(gen->GetArgAddress(0)), argsCount - 1, args.Buffer());
  436. }
  437. #endif
  438. // This function is called after ASRegisterGenerated()
  439. void ASRegisterManualLast_Container(asIScriptEngine* engine)
  440. {
  441. static StringFactory stringFactory;
  442. engine->RegisterStringFactory("String", &stringFactory);
  443. engine->RegisterObjectMethod("String", "String& opAssign(int)", AS_FUNCTION_OBJLAST(StringAssignInt), AS_CALL_CDECL_OBJLAST);
  444. engine->RegisterObjectMethod("String", "String opAdd(int) const", AS_FUNCTION_OBJLAST(StringAddInt), AS_CALL_CDECL_OBJLAST);
  445. engine->RegisterObjectMethod("String", "String opAdd_r(int) const", AS_FUNCTION_OBJLAST(StringAddIntReverse), AS_CALL_CDECL_OBJLAST);
  446. engine->RegisterObjectMethod("String", "String& opAssign(uint)", AS_FUNCTION_OBJLAST(StringAssignUInt), AS_CALL_CDECL_OBJLAST);
  447. engine->RegisterObjectMethod("String", "String opAdd(uint) const", AS_FUNCTION_OBJLAST(StringAddUInt), AS_CALL_CDECL_OBJLAST);
  448. engine->RegisterObjectMethod("String", "String opAdd_r(uint) const", AS_FUNCTION_OBJLAST(StringAddUIntReverse), AS_CALL_CDECL_OBJLAST);
  449. engine->RegisterObjectMethod("String", "String& opAssign(float)", AS_FUNCTION_OBJLAST(StringAssignFloat), AS_CALL_CDECL_OBJLAST);
  450. engine->RegisterObjectMethod("String", "String opAdd(float) const", AS_FUNCTION_OBJLAST(StringAddFloat), AS_CALL_CDECL_OBJLAST);
  451. engine->RegisterObjectMethod("String", "String opAdd_r(float) const", AS_FUNCTION_OBJLAST(StringAddFloatReverse), AS_CALL_CDECL_OBJLAST);
  452. engine->RegisterObjectMethod("String", "String& opAssign(double)", AS_FUNCTION_OBJLAST(StringAssignDouble), AS_CALL_CDECL_OBJLAST);
  453. engine->RegisterObjectMethod("String", "String& opAddAssign(double)", AS_FUNCTION_OBJLAST(StringAddAssignDouble), AS_CALL_CDECL_OBJLAST);
  454. engine->RegisterObjectMethod("String", "String opAdd(double) const", AS_FUNCTION_OBJLAST(StringAddDouble), AS_CALL_CDECL_OBJLAST);
  455. engine->RegisterObjectMethod("String", "String opAdd_r(double) const", AS_FUNCTION_OBJLAST(StringAddDoubleReverse), AS_CALL_CDECL_OBJLAST);
  456. engine->RegisterObjectMethod("String", "String& opAssign(bool)", AS_FUNCTION_OBJLAST(StringAssignBool), AS_CALL_CDECL_OBJLAST);
  457. engine->RegisterObjectMethod("String", "String opAdd(bool) const", AS_FUNCTION_OBJLAST(StringAddBool), AS_CALL_CDECL_OBJLAST);
  458. engine->RegisterObjectMethod("String", "String opAdd_r(bool) const", AS_FUNCTION_OBJLAST(StringAddBoolReverse), AS_CALL_CDECL_OBJLAST);
  459. #ifndef AS_MAX_PORTABILITY
  460. engine->RegisterObjectMethod("String", "String f()const", AS_FUNCTION_OBJFIRST(format_args0), AS_CALL_CDECL_OBJFIRST);
  461. engine->RegisterObjectMethod("String", "String f(?&in a0)const", AS_FUNCTION_OBJFIRST(format_args1), AS_CALL_CDECL_OBJFIRST);
  462. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1)const", AS_FUNCTION_OBJFIRST(format_args2), AS_CALL_CDECL_OBJFIRST);
  463. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1,?&in a2)const", AS_FUNCTION_OBJFIRST(format_args3), AS_CALL_CDECL_OBJFIRST);
  464. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1,?&in a2,?&in a3)const", AS_FUNCTION_OBJFIRST(format_args4), AS_CALL_CDECL_OBJFIRST);
  465. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1,?&in a2,?&in a3,?&in a4)const", AS_FUNCTION_OBJFIRST(format_args5), AS_CALL_CDECL_OBJFIRST);
  466. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5)const",AS_FUNCTION_OBJFIRST(format_args6), AS_CALL_CDECL_OBJFIRST);
  467. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5,?&in a6)const", AS_FUNCTION_OBJFIRST(format_args7), AS_CALL_CDECL_OBJFIRST);
  468. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5,?&in a6,?&in a7)const", AS_FUNCTION_OBJFIRST(format_args8), AS_CALL_CDECL_OBJFIRST);
  469. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5,?&in a6,?&in a7,?&in a8)const", AS_FUNCTION_OBJFIRST(format_args9), AS_CALL_CDECL_OBJFIRST);
  470. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5,?&in a6,?&in a7,?&in a8,?&in a9)const",AS_FUNCTION_OBJFIRST(format_argsA), AS_CALL_CDECL_OBJFIRST);
  471. engine->RegisterGlobalFunction("String format(const String&in pattern)", AS_FUNCTION(format_args0), AS_CALL_CDECL);
  472. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0)", AS_FUNCTION(format_args1), AS_CALL_CDECL);
  473. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1)", AS_FUNCTION(format_args2), AS_CALL_CDECL);
  474. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1,?&in a2)", AS_FUNCTION(format_args3), AS_CALL_CDECL);
  475. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1,?&in a2,?&in a3)", AS_FUNCTION(format_args4), AS_CALL_CDECL);
  476. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1,?&in a2,?&in a3,?&in a4)", AS_FUNCTION(format_args5), AS_CALL_CDECL);
  477. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5)", AS_FUNCTION(format_args6), AS_CALL_CDECL);
  478. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5,?&in a6)", AS_FUNCTION(format_args7), AS_CALL_CDECL);
  479. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5,?&in a6,?&in a7)", AS_FUNCTION(format_args8), AS_CALL_CDECL);
  480. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5,?&in a6,?&in a7,?&in a8)", AS_FUNCTION(format_args9), AS_CALL_CDECL);
  481. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5,?&in a6,?&in a7,?&in a8,?&in a9)", AS_FUNCTION(format_argsA), AS_CALL_CDECL);
  482. #else
  483. engine->RegisterObjectMethod("String", "String f()const", asFUNCTION(String_Format_gen), asCALL_GENERIC);
  484. engine->RegisterObjectMethod("String", "String f(?&in a0)const", asFUNCTION(String_Format_gen), asCALL_GENERIC);
  485. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1)const", asFUNCTION(String_Format_gen), asCALL_GENERIC);
  486. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1,?&in a2)const", asFUNCTION(String_Format_gen), asCALL_GENERIC);
  487. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1,?&in a2,?&in a3)const", asFUNCTION(String_Format_gen), asCALL_GENERIC);
  488. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1,?&in a2,?&in a3,?&in a4)const", asFUNCTION(String_Format_gen), asCALL_GENERIC);
  489. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5)const", asFUNCTION(String_Format_gen), asCALL_GENERIC);
  490. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5,?&in a6)const", asFUNCTION(String_Format_gen), asCALL_GENERIC);
  491. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5,?&in a6,?&in a7)const", asFUNCTION(String_Format_gen), asCALL_GENERIC);
  492. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5,?&in a6,?&in a7,?&in a8)const", asFUNCTION(String_Format_gen), asCALL_GENERIC);
  493. engine->RegisterObjectMethod("String", "String f(?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5,?&in a6,?&in a7,?&in a8,?&in a9)const", asFUNCTION(String_Format_gen), asCALL_GENERIC);
  494. engine->RegisterGlobalFunction("String format(const String&in pattern)", asFUNCTION(Format_String_gen), asCALL_GENERIC);
  495. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0)", asFUNCTION(Format_String_gen), asCALL_GENERIC);
  496. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1)", asFUNCTION(Format_String_gen), asCALL_GENERIC);
  497. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1,?&in a2)", asFUNCTION(Format_String_gen), asCALL_GENERIC);
  498. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1,?&in a2,?&in a3)", asFUNCTION(Format_String_gen), asCALL_GENERIC);
  499. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1,?&in a2,?&in a3,?&in a4)", asFUNCTION(Format_String_gen), asCALL_GENERIC);
  500. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5)", asFUNCTION(Format_String_gen), asCALL_GENERIC);
  501. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5,?&in a6)", asFUNCTION(Format_String_gen), asCALL_GENERIC);
  502. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5,?&in a6,?&in a7)", asFUNCTION(Format_String_gen), asCALL_GENERIC);
  503. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5,?&in a6,?&in a7,?&in a8)", asFUNCTION(Format_String_gen), asCALL_GENERIC);
  504. engine->RegisterGlobalFunction("String format(const String&in pattern,?&in a0,?&in a1,?&in a2,?&in a3,?&in a4,?&in a5,?&in a6,?&in a7,?&in a8,?&in a9)", asFUNCTION(Format_String_gen), asCALL_GENERIC);
  505. #endif
  506. }
  507. }