static HRESULT invoke_source(script_ctx_t *ctx, FunctionInstance *function, IDispatch *this_obj, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *var_disp, *arg_disp; exec_ctx_t *exec_ctx; scope_chain_t *scope; HRESULT hres; if(ctx->state == SCRIPTSTATE_UNINITIALIZED || ctx->state == SCRIPTSTATE_CLOSED) { WARN("Script engine state does not allow running code.\n"); return E_UNEXPECTED; } if(!function->func_code) { FIXME("no source\n"); return E_FAIL; } hres = create_var_disp(ctx, function, argc, argv, &var_disp); if(FAILED(hres)) return hres; hres = create_arguments(ctx, function, var_disp, argc, argv, &arg_disp); if(FAILED(hres)) { jsdisp_release(var_disp); return hres; } hres = jsdisp_propput(var_disp, argumentsW, PROPF_DONTDELETE, jsval_obj(arg_disp)); if(FAILED(hres)) { jsdisp_release(arg_disp); jsdisp_release(var_disp); return hres; } hres = scope_push(function->scope_chain, var_disp, to_disp(var_disp), &scope); if(SUCCEEDED(hres)) { hres = create_exec_ctx(ctx, this_obj, var_disp, scope, FALSE, &exec_ctx); scope_release(scope); if(SUCCEEDED(hres)) { jsdisp_t *prev_args; prev_args = function->arguments; function->arguments = arg_disp; hres = exec_source(exec_ctx, function->code, function->func_code, FALSE, r); function->arguments = prev_args; exec_release(exec_ctx); } } /* Reset arguments value to cut the reference cycle. Note that since all activation contexts have * their own arguments property, it's impossible to use prototype's one during name lookup */ jsdisp_propput_name(var_disp, argumentsW, jsval_undefined()); jsdisp_release(arg_disp); jsdisp_release(var_disp); return hres; }
static HRESULT create_var_disp(script_ctx_t *ctx, FunctionInstance *function, DISPPARAMS *dp, jsexcept_t *ei, IServiceProvider *caller, DispatchEx **ret) { DispatchEx *var_disp, *arg_disp; HRESULT hres; static const WCHAR argumentsW[] = {'a','r','g','u','m','e','n','t','s',0}; hres = create_dispex(ctx, NULL, NULL, &var_disp); if(FAILED(hres)) return hres; hres = create_arguments(ctx, (IDispatch*)_IDispatchEx_(&function->dispex), dp, ei, caller, &arg_disp); if(SUCCEEDED(hres)) { VARIANT var; V_VT(&var) = VT_DISPATCH; V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(arg_disp); hres = jsdisp_propput_name(var_disp, argumentsW, &var, ei, caller); jsdisp_release(arg_disp); } if(SUCCEEDED(hres)) hres = init_parameters(var_disp, function, dp, ei, caller); if(FAILED(hres)) { jsdisp_release(var_disp); return hres; } *ret = var_disp; return S_OK; }
void redirect_stdin(char *program, char* redirect_type, char *file_name) { printf("redirectiong stdin........\n"); int status; //exec command pid_t pID = fork(); if (pID == 0) { // child char * args[MAX_PARAM_NUMBER]; strcat(program, " "); strcat(program, file_name); create_arguments(args, program); if(execvp(args[0],args)==-1) printf("%s\n","cannot extec. "); exit(0); } else if (pID < 0) { // failed to fork exit(1); // Throw exception } else { // parent // Code only executed by parent process pID = wait(&status); last_process_status_code = status; } }
static HRESULT invoke_source(script_ctx_t *ctx, FunctionInstance *function, IDispatch *this_obj, unsigned argc, jsval_t *argv, BOOL is_constructor, BOOL caller_execs_source, jsval_t *r) { jsdisp_t *var_disp, *arg_disp; scope_chain_t *scope; HRESULT hres; if(ctx->state == SCRIPTSTATE_UNINITIALIZED || ctx->state == SCRIPTSTATE_CLOSED) { WARN("Script engine state does not allow running code.\n"); return E_UNEXPECTED; } if(!function->func_code) { FIXME("no source\n"); return E_FAIL; } hres = create_var_disp(ctx, function, argc, argv, &var_disp); if(FAILED(hres)) return hres; hres = create_arguments(ctx, function, var_disp, argc, argv, &arg_disp); if(FAILED(hres)) { jsdisp_release(var_disp); return hres; } hres = jsdisp_propput(var_disp, argumentsW, PROPF_DONTDELETE, jsval_obj(arg_disp)); if(FAILED(hres)) { jsdisp_release(arg_disp); jsdisp_release(var_disp); return hres; } hres = scope_push(function->scope_chain, var_disp, to_disp(var_disp), &scope); if(SUCCEEDED(hres)) { DWORD exec_flags = 0; if(caller_execs_source) exec_flags |= EXEC_RETURN_TO_INTERP; if(is_constructor) exec_flags |= EXEC_CONSTRUCTOR; hres = exec_source(ctx, exec_flags, function->code, function->func_code, scope, this_obj, &function->dispex, var_disp, arg_disp, r); scope_release(scope); } jsdisp_release(arg_disp); jsdisp_release(var_disp); return hres; }
void redirect_stdout(char *program, char* redirect_type, char *file_name) { int status; //exec command pid_t pID = fork(); if (pID == 0) { // child int out_file_fd; if (strcmp(redirect_type, ">") == 0) { out_file_fd = open(file_name, O_RDWR|O_CREAT|O_TRUNC, S_IRWXU|S_IRWXG|S_IRWXO); } else if (strcmp(redirect_type, ">>") == 0) { out_file_fd = open(file_name, O_RDWR|O_CREAT|O_APPEND, S_IRWXU|S_IRWXG|S_IRWXO); } if (-1 == out_file_fd) { printf("error opening file:%s\n", file_name); exit(4); } //redirect stdout to file if (dup2(out_file_fd, fileno(stdout)) == -1) { printf("error redirectiong stdout to file\n"); exit(5); } char * args[MAX_PARAM_NUMBER]; create_arguments(args, program); if(is_builtin(program)==1) { char * tem[MAX_PARAM_NUMBER]; tem[0]=PARAMS[1]; call_function(PARAMS[0],tem,N_params-1); } else if(execvp(args[0],args)==-1) printf("%s\n","cannot extec"); fflush(stdout); close(out_file_fd); exit(0); } else if (pID < 0) { // failed to fork exit(1); // Throw exception } else { // parent // Code only executed by parent process pID = wait(&status); last_process_status_code = status; } }
void redirect_stdin_stdout(char *program, char* redirect_type1, char *file_name_in, char* redirect_type2 , char *file_name_out) { int status; //exec command pid_t pID = fork(); if (pID == 0) { // child int out_file_fd; if (strcmp(redirect_type2, ">") == 0) { out_file_fd = open(file_name_out, O_RDWR|O_CREAT|O_TRUNC, S_IRWXU|S_IXUSR|S_IRWXG|S_IXGRP|S_IRWXO|S_IXOTH); } else if (strcmp(redirect_type2, ">>") == 0) { out_file_fd = open(file_name_out, O_RDWR|O_CREAT|O_APPEND, S_IRWXU|S_IXUSR|S_IRWXG|S_IXGRP|S_IRWXO|S_IXOTH); } if (-1 == out_file_fd) { printf("error opening file:%s\n", file_name_out); exit(4); } //redirect stdout to file if (dup2(out_file_fd, fileno(stdout)) == -1) { printf("error redirectiong stdout to file\n"); exit(5); } char * args[MAX_PARAM_NUMBER]; strcat(program, " "); strcat(program, file_name_in); create_arguments(args, program); if(execvp(args[0],args)==-1) printf("%s\n","cannot extec"); fflush(stdout); close(out_file_fd); exit(0); } else if (pID < 0) { // failed to fork exit(1); // Throw exception } else { // parent // Code only executed by parent process pID = wait(&status); last_process_status_code = status; } }
static HRESULT invoke_source(script_ctx_t *ctx, FunctionInstance *function, IDispatch *this_obj, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { jsdisp_t *var_disp, *arg_disp; exec_ctx_t *exec_ctx; scope_chain_t *scope; HRESULT hres; if(!function->source) { FIXME("no source\n"); return E_FAIL; } hres = create_arguments(ctx, to_disp(&function->dispex), dp, ei, caller, &arg_disp); if(FAILED(hres)) return hres; hres = create_var_disp(ctx, function, arg_disp, dp, ei, caller, &var_disp); if(FAILED(hres)) { jsdisp_release(arg_disp); return hres; } hres = scope_push(function->scope_chain, var_disp, &scope); if(SUCCEEDED(hres)) { hres = create_exec_ctx(ctx, this_obj, var_disp, scope, FALSE, &exec_ctx); scope_release(scope); } jsdisp_release(var_disp); if(SUCCEEDED(hres)) { jsdisp_t *prev_args; prev_args = function->arguments; function->arguments = arg_disp; hres = exec_source(exec_ctx, function->parser, function->source, FALSE, ei, retv); function->arguments = prev_args; jsdisp_release(arg_disp); exec_release(exec_ctx); } return hres; }
static HRESULT invoke_source(script_ctx_t *ctx, FunctionInstance *function, IDispatch *this_obj, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *var_disp, *arg_disp; exec_ctx_t *exec_ctx; scope_chain_t *scope; HRESULT hres; if(!function->func_code) { FIXME("no source\n"); return E_FAIL; } hres = create_arguments(ctx, to_disp(&function->dispex), argc, argv, &arg_disp); if(FAILED(hres)) return hres; hres = create_var_disp(ctx, function, arg_disp, argc, argv, &var_disp); if(FAILED(hres)) { jsdisp_release(arg_disp); return hres; } hres = scope_push(function->scope_chain, var_disp, to_disp(var_disp), &scope); if(SUCCEEDED(hres)) { hres = create_exec_ctx(ctx, this_obj, var_disp, scope, FALSE, &exec_ctx); scope_release(scope); } jsdisp_release(var_disp); if(SUCCEEDED(hres)) { jsdisp_t *prev_args; prev_args = function->arguments; function->arguments = arg_disp; hres = exec_source(exec_ctx, function->code, function->func_code, FALSE, r); function->arguments = prev_args; } jsdisp_release(arg_disp); exec_release(exec_ctx); return hres; }