Object* BlockEnvironment::invoke(STATE, CallFrame* previous, BlockEnvironment* env, Arguments& args, BlockInvocation& invocation) { MachineCode* mcode = env->compiled_code_->machine_code(); if(!mcode) { OnStack<3> os(state, env, args.recv_location(), args.block_location()); OnStack<3> iv(state, invocation.self, invocation.constant_scope, invocation.module); VariableRootBuffer vrb(state->vm()->current_root_buffers(), &args.arguments_location(), args.total()); GCTokenImpl gct; mcode = env->machine_code(state, gct, previous); if(!mcode) { Exception::internal_error(state, previous, "invalid bytecode method"); return 0; } } state->vm()->metrics().machine.blocks_invoked++; #ifdef ENABLE_LLVM if(executor ptr = mcode->unspecialized) { return (*((BlockExecutor)ptr))(state, previous, env, args, invocation); } #endif return execute_interpreter(state, previous, env, args, invocation); }
Object* BlockEnvironment::invoke(STATE, CallFrame* previous, BlockEnvironment* env, Arguments& args, BlockInvocation& invocation) { MachineCode* mcode = env->compiled_code_->machine_code(); if(!mcode) { OnStack<2> os(state, env, args.argument_container_location()); GCTokenImpl gct; mcode = env->machine_code(state, gct, previous); if(!mcode) { Exception::internal_error(state, previous, "invalid bytecode method"); return 0; } } #ifdef ENABLE_LLVM if(executor ptr = mcode->unspecialized) { return (*((BlockExecutor)ptr))(state, previous, env, args, invocation); } #endif return execute_interpreter(state, previous, env, args, invocation); }
Object* BlockEnvironment::invoke(STATE, BlockEnvironment* env, Arguments& args, BlockInvocation& invocation) { MachineCode* mcode = env->compiled_code()->machine_code(); if(!mcode) { mcode = env->machine_code(state); if(!mcode) { Exception::internal_error(state, "invalid bytecode method"); return 0; } } state->vm()->metrics().machine.blocks_invoked++; #ifdef ENABLE_LLVM if(executor ptr = mcode->unspecialized) { return (*((BlockExecutor)ptr))(state, env, args, invocation); } #endif return execute_interpreter(state, env, args, invocation); }
Object* BlockEnvironment::invoke(STATE, CallFrame* previous, BlockEnvironment* env, Arguments& args, BlockInvocation& invocation) { VMMethod* vmm = env->code_->backend_method(); if(!vmm) { OnStack<2> os(state, env, args.argument_container_location()); GCTokenImpl gct; vmm = env->vmmethod(state, gct); } if(!vmm) { Exception::internal_error(state, previous, "invalid bytecode method"); return 0; } #ifdef ENABLE_LLVM if(executor ptr = vmm->unspecialized) { return (*((BlockExecutor)ptr))(state, previous, env, args, invocation); } #endif return execute_interpreter(state, previous, env, args, invocation); }
Object* BlockEnvironment::invoke(STATE, CallFrame* previous, BlockEnvironment* const env, Arguments& args, BlockInvocation& invocation) { #ifdef ENABLE_LLVM VMMethod* vmm = env->vmmethod(state); if(!vmm) { Exception::internal_error(state, previous, "invalid bytecode method"); return 0; } if(void* ptr = vmm->native_function()) { return (*((BlockExecutor)ptr))(state, previous, env, args, invocation); } #endif return execute_interpreter(state, previous, env, args, invocation); }