use Shield instead of raw PROTECT/UNPROTECT