fcontext.monkey2 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. 'For testing purposes only - use Fiber instead!
  2. '
  3. 'Will generally cause havoc on GC and debugger as they wont know you're messing with the stack...
  4. Namespace std.fiber
  5. #import "native/fcontext.cpp"
  6. #import "native/fcontext.h"
  7. #if __TARGET__="android"
  8. #import "native/asm/make_arm_aapcs_elf_gas.S"
  9. #import "native/asm/jump_arm_aapcs_elf_gas.S"
  10. #import "native/asm/ontop_arm_aapcs_elf_gas.S"
  11. #else if __HOSTOS__="windows"
  12. #import "native/asm/make_i386_ms_pe_gas.asm"
  13. #import "native/asm/jump_i386_ms_pe_gas.asm"
  14. #import "native/asm/ontop_i386_ms_pe_gas.asm"
  15. #else if __HOSTOS__="macos"
  16. #import "native/asm/make_x86_64_sysv_macho_gas.S"
  17. #import "native/asm/jump_x86_64_sysv_macho_gas.S"
  18. #import "native/asm/ontop_x86_64_sysv_macho_gas.S"
  19. #else if __HOSTOS__="linux"
  20. #import "native/asm/make_x86_64_sysv_elf_gas.S"
  21. #import "native/asm/jump_x86_64_sysv_elf_gas.S"
  22. #import "native/asm/ontop_x86_64_sysv_elf_gas.S"
  23. #end
  24. Extern
  25. Alias fcontext_t:Void Ptr
  26. Struct transfer_t
  27. Field fcontext:fcontext_t
  28. Field data:Void Ptr
  29. End
  30. Function alloc_fcontext_stack:UByte Ptr( size:ULong )
  31. Function free_fcontext_stack( stack:Void Ptr,size:ULong )
  32. Function jump_fcontext:transfer_t( fcontext:fcontext_t,data:Void Ptr )
  33. Function make_fcontext:fcontext_t( stack:Void Ptr,stack_size:ULong,func:Void( transfer_t ) )
  34. Function ontop_fcontext:transfer_t( fcontext:fcontext_t,vp:Void ptr,func:transfer_t(transfer_t) )
  35. Public
  36. #rem
  37. Function Test( t:transfer_t )
  38. Print "Test 1"
  39. Print ULong( t.fcontext )
  40. t=jump_fcontext( t.fcontext,Null )
  41. Print "Test 2"
  42. Print ULong( t.fcontext )
  43. jump_fcontext( t.fcontext,Null )
  44. End
  45. Function Test2( fcontext:fcontext_t )
  46. jump_fcontext( fcontext,Null )
  47. End
  48. Function Main()
  49. Local stack:=alloc_fcontext_stack( 65536 )
  50. Local fcontext:=make_fcontext( stack+65536,65536,Test )
  51. fcontext=jump_fcontext( fcontext,Null ).fcontext
  52. Test2( fcontext )
  53. ' fcontext=jump_fcontext( fcontext,Null ).fcontext
  54. Return
  55. Print "Main"
  56. fcontext=jump_fcontext( fcontext,Null ).fcontext
  57. Print "Main"
  58. Test2( fcontext )
  59. End
  60. #end