import inspect
import types
def get_cc():
"""Generate the current continuation."""
up_frame = inspect.currentframe().f_back
def copy_code(base, co_code):
"""Copy a code object, but change the code"""
return types.CodeType(base.co_argcount,
base.co_kwonlyargcount,
base.co_nlocals,
base.co_stacksize,
base.co_flags,
co_code,
base.co_consts,
base.co_names,
base.co_varnames,
base.co_filename,
base.co_name,
base.co_firstlineno,
base.co_lnotab,
base.co_freevars,
base.co_cellvars)
# In this case, the call to get_cc and the resulting assignment to a global variable
# is 4 bytes worth of bytecode.
new_code = copy_code(up_frame.f_code, up_frame.f_code.co_code[up_frame.f_lasti + 6:])
return new_code
def call_cc(cont):
"""Call the current continuation"""
exec(cont)
cc, bar = None, 0
def func():
global cc
print("This should show only once")
cc = get_cc()
global bar
print(bar)
bar += 1
func()
call_cc(cc)
call_cc(cc)
call_cc(cc)
aW1wb3J0IGluc3BlY3QKaW1wb3J0IHR5cGVzCgpkZWYgZ2V0X2NjKCk6CgkiIiJHZW5lcmF0ZSB0aGUgY3VycmVudCBjb250aW51YXRpb24uIiIiCgl1cF9mcmFtZSA9IGluc3BlY3QuY3VycmVudGZyYW1lKCkuZl9iYWNrCgoJZGVmIGNvcHlfY29kZShiYXNlLCBjb19jb2RlKToKCQkiIiJDb3B5IGEgY29kZSBvYmplY3QsIGJ1dCBjaGFuZ2UgdGhlIGNvZGUiIiIKCQlyZXR1cm4gdHlwZXMuQ29kZVR5cGUoYmFzZS5jb19hcmdjb3VudCwKCQkgICAgICAgICAgICAgICAgICAgICAgYmFzZS5jb19rd29ubHlhcmdjb3VudCwKCQkgICAgICAgICAgICAgICAgICAgICAgYmFzZS5jb19ubG9jYWxzLAoJCSAgICAgICAgICAgICAgICAgICAgICBiYXNlLmNvX3N0YWNrc2l6ZSwKCQkgICAgICAgICAgICAgICAgICAgICAgYmFzZS5jb19mbGFncywKCQkgICAgICAgICAgICAgICAgICAgICAgY29fY29kZSwKCQkgICAgICAgICAgICAgICAgICAgICAgYmFzZS5jb19jb25zdHMsCgkJICAgICAgICAgICAgICAgICAgICAgIGJhc2UuY29fbmFtZXMsCgkJICAgICAgICAgICAgICAgICAgICAgIGJhc2UuY29fdmFybmFtZXMsCgkJICAgICAgICAgICAgICAgICAgICAgIGJhc2UuY29fZmlsZW5hbWUsCgkJICAgICAgICAgICAgICAgICAgICAgIGJhc2UuY29fbmFtZSwKCQkgICAgICAgICAgICAgICAgICAgICAgYmFzZS5jb19maXJzdGxpbmVubywKCQkgICAgICAgICAgICAgICAgICAgICAgYmFzZS5jb19sbm90YWIsCgkJICAgICAgICAgICAgICAgICAgICAgIGJhc2UuY29fZnJlZXZhcnMsCgkJICAgICAgICAgICAgICAgICAgICAgIGJhc2UuY29fY2VsbHZhcnMpCgoJIyBJbiB0aGlzIGNhc2UsIHRoZSBjYWxsIHRvIGdldF9jYyBhbmQgdGhlIHJlc3VsdGluZyBhc3NpZ25tZW50IHRvIGEgZ2xvYmFsIHZhcmlhYmxlCgkjIGlzIDQgYnl0ZXMgd29ydGggb2YgYnl0ZWNvZGUuCgluZXdfY29kZSA9IGNvcHlfY29kZSh1cF9mcmFtZS5mX2NvZGUsIHVwX2ZyYW1lLmZfY29kZS5jb19jb2RlW3VwX2ZyYW1lLmZfbGFzdGkgKyA2Ol0pCglyZXR1cm4gbmV3X2NvZGUKCgpkZWYgY2FsbF9jYyhjb250KToKCSIiIkNhbGwgdGhlIGN1cnJlbnQgY29udGludWF0aW9uIiIiCglleGVjKGNvbnQpCgoKY2MsIGJhciA9IE5vbmUsIDAKCmRlZiBmdW5jKCk6CglnbG9iYWwgY2MKCXByaW50KCJUaGlzIHNob3VsZCBzaG93IG9ubHkgb25jZSIpCgljYyA9IGdldF9jYygpCglnbG9iYWwgYmFyCglwcmludChiYXIpCgliYXIgKz0gMQoKZnVuYygpCmNhbGxfY2MoY2MpCmNhbGxfY2MoY2MpCmNhbGxfY2MoY2Mp