示例#1
0
文件: function.c 项目: 340211173/wine
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;
}
示例#2
0
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;

   	}
}
示例#4
0
文件: function.c 项目: bdidemus/wine
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;

   	}
}
示例#7
0
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;
}
示例#8
0
文件: function.c 项目: bpowers/wine
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;
}