use opcodes for primitives instead of function pointers