fcontext.monkey2 1.8 KB

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