JSBClassWriter.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. source.AppendWithFormat("static void jsb_class_define_%s(JSVM* vm)\n{\n", klass_->GetName().CString());
  35. source.Append("duk_context* ctx = vm->GetJSContext();\n");
  36. source.AppendWithFormat("js_class_get_prototype(ctx, \"%s\");\n", klass_->GetName().CString());
  37. for (unsigned i = 0; i < klass_->functions_.Size(); i++)
  38. {
  39. JSBFunction* function = klass_->functions_.At(i);
  40. if (function->Skip())
  41. continue;
  42. if (function->IsConstructor() || function->IsDestructor())
  43. continue;
  44. if (function->FirstDefaultParameter() != -1)
  45. {
  46. source.AppendWithFormat("duk_push_c_function(ctx, jsb_class_%s_%s, DUK_VARARGS);\n", klass_->GetName().CString(), function->GetName().CString());
  47. }
  48. else
  49. {
  50. source.AppendWithFormat("duk_push_c_function(ctx, jsb_class_%s_%s, %i);\n", klass_->GetName().CString(), function->GetName().CString(), (int) function->GetParameters().Size());
  51. }
  52. String scriptName = function->GetName();
  53. scriptName[0] = tolower(scriptName[0]);
  54. source.AppendWithFormat("duk_put_prop_string(ctx, -2, \"%s\");\n", scriptName.CString());
  55. }
  56. source.Append("duk_pop(ctx);\n");
  57. source.Append("}\n");
  58. sourceOut += source;
  59. }
  60. }