JSBClassWriter.cpp 2.2 KB

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