JSBClassWriter.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include <Atomic/IO/FileSystem.h>
  2. #include "JSBind.h"
  3. #include "JSBModule.h"
  4. #include "JSBPackage.h"
  5. #include "JSBEnum.h"
  6. #include "JSBClass.h"
  7. #include "JSBFunction.h"
  8. #include "JSBClassWriter.h"
  9. #include "JSBFunctionWriter.h"
  10. namespace ToolCore
  11. {
  12. JSBClassWriter::JSBClassWriter(JSBClass *klass) : klass_(klass)
  13. {
  14. }
  15. void JSBClassWriter::WriteFunctions(String& source)
  16. {
  17. for (unsigned i = 0; i < klass_->functions_.Size(); i++)
  18. {
  19. JSBFunction* function = klass_->functions_.At(i);
  20. if (function->Skip())
  21. continue;
  22. if (function->IsDestructor())
  23. continue;
  24. JSBFunctionWriter writer(function);
  25. writer.GenerateSource(source);
  26. }
  27. }
  28. void JSBClassWriter::GenerateSource(String& sourceOut)
  29. {
  30. String source = "";
  31. if (klass_->IsNumberArray())
  32. return;
  33. WriteFunctions(source);
  34. String packageName = klass_->GetModule()->GetPackage()->GetName();
  35. source.AppendWithFormat("static void jsb_class_define_%s(JSVM* vm)\n{\n", klass_->GetName().CString());
  36. source.Append("duk_context* ctx = vm->GetJSContext();\n");
  37. GenerateStaticFunctionsSource(source, packageName);
  38. GenerateNonStaticFunctionsSource(source, packageName);
  39. source.Append("}\n");
  40. sourceOut += source;
  41. }
  42. void JSBClassWriter::GenerateStaticFunctionsSource(String& source, String& packageName)
  43. {
  44. source.AppendWithFormat("js_class_get_constructor(ctx, \"%s\", \"%s\");\n", packageName.CString(), klass_->GetName().CString());
  45. for (unsigned i = 0; i < klass_->functions_.Size(); i++)
  46. {
  47. JSBFunction* function = klass_->functions_.At(i);
  48. if (function->Skip())
  49. continue;
  50. if (function->IsConstructor() || function->IsDestructor())
  51. continue;
  52. if (!function->IsStatic())
  53. continue;
  54. if (function->FirstDefaultParameter() != -1)
  55. {
  56. source.AppendWithFormat("duk_push_c_function(ctx, jsb_class_%s_%s, DUK_VARARGS);\n", klass_->GetName().CString(), function->GetName().CString());
  57. }
  58. else
  59. {
  60. source.AppendWithFormat("duk_push_c_function(ctx, jsb_class_%s_%s, %i);\n", klass_->GetName().CString(), function->GetName().CString(), (int)function->GetParameters().Size());
  61. }
  62. String scriptName = function->GetName();
  63. scriptName[0] = tolower(scriptName[0]);
  64. source.AppendWithFormat("duk_put_prop_string(ctx, -2, \"%s\");\n", scriptName.CString());
  65. }
  66. source.Append("duk_pop(ctx);\n");
  67. }
  68. void JSBClassWriter::GenerateNonStaticFunctionsSource(String& source, String& packageName)
  69. {
  70. source.AppendWithFormat("js_class_get_prototype(ctx, \"%s\", \"%s\");\n", packageName.CString(), klass_->GetName().CString());
  71. for (unsigned i = 0; i < klass_->functions_.Size(); i++)
  72. {
  73. JSBFunction* function = klass_->functions_.At(i);
  74. if (function->Skip())
  75. continue;
  76. if (function->IsConstructor() || function->IsDestructor())
  77. continue;
  78. if (function->IsStatic())
  79. continue;
  80. if (function->FirstDefaultParameter() != -1)
  81. {
  82. source.AppendWithFormat("duk_push_c_function(ctx, jsb_class_%s_%s, DUK_VARARGS);\n", klass_->GetName().CString(), function->GetName().CString());
  83. }
  84. else
  85. {
  86. source.AppendWithFormat("duk_push_c_function(ctx, jsb_class_%s_%s, %i);\n", klass_->GetName().CString(), function->GetName().CString(), (int)function->GetParameters().Size());
  87. }
  88. String scriptName = function->GetName();
  89. scriptName[0] = tolower(scriptName[0]);
  90. source.AppendWithFormat("duk_put_prop_string(ctx, -2, \"%s\");\n", scriptName.CString());
  91. }
  92. source.Append("duk_pop(ctx);\n");
  93. }
  94. }