Пример #1
0
void		execute_cmd(char **cmd, char *cmdp, char **env)
{
	char	*tmp;
	pid_t	father;

	tmp = NULL;
	tmp = set_tmp(cmdp, tmp, env, cmd);
	if (access(ft_strjoin(tmp, cmd[0]), X_OK) != -1 && ft_strlen(cmd[0]) > 1)
	{
		father = fork();
		if (father > 0)
			wait(0);
		else if (father == 0)
		{
			signal(SIGINT, SIG_DFL);
			cmdp = ft_strjoin(tmp, cmd[0]);
			execve(cmdp, cmd, env);
			ft_strdel(&cmdp);
		}
		else
			ft_putendl("cannot fork");
	}
	else if (access(cmd[0], X_OK) == -1 && exist(env, cmd[0]))
		ft_putstrstr_fd(cmd[0], ": Permission denied\n", 2);
	else
		ft_putendl_fd("command not found", 2);
	ft_strdel(&tmp);
}
Пример #2
0
static void rt_eval_or ( IL_node *tmp )
{
    Var *value_a,*value_b;
    value_a=IL_rt_Evaluate ( tmp->exp->A );
    value_b=IL_rt_Evaluate ( tmp->exp->B );
    last_tmp_value=var_or ( *value_a, *value_b );
    set_tmp(tmp->tmp_index,&last_tmp_value,TMP_ARITH);
}
Пример #3
0
static void rt_eval_less_or_equal ( IL_node *tmp )
{
    Var *value_a,*value_b;
    value_a=IL_rt_Evaluate ( tmp->exp->A );
    value_b=IL_rt_Evaluate ( tmp->exp->B );
    last_tmp_value=var_less_or_equal ( *value_a,*value_b );
    set_tmp(tmp->tmp_index,&last_tmp_value,TMP_DEREFER);
}
Пример #4
0
/*在运行时解析下标运算*/
static void rt_eval_subscript(IL_node *tmp)
{
    Var *value_a, *value_b,*result;
    value_a=IL_rt_Evaluate ( tmp->exp->A );
    value_b=IL_rt_Evaluate ( tmp->exp->B );
    result=GetListElement (*value_a,var_GetInt (*value_b));
    set_tmp(tmp->tmp_index,result,TMP_DEREFER);
    last_tmp_value=*result;
}
Пример #5
0
/*在运行时解析节点的加法运算*/
static void rt_eval_plus ( IL_node *tmp )
{
    Var  *value_a, * value_b;
	/*根据栈中的函数调用情况获取栈中绝对定位下的变量*/
    value_a=IL_rt_Evaluate ( tmp->exp->A );
    value_b=IL_rt_Evaluate ( tmp->exp->B );
    last_tmp_value=var_add ( *value_a,*value_b );
    set_tmp(tmp->tmp_index,&last_tmp_value,TMP_ARITH);
}
Пример #6
0
static void rt_eval_assign ( IL_node *tmp ,int mode)
{

	if ( tmp->exp->A.type==ELEMENT_VAR /*局部变量*/
            ||(tmp->exp->A.type==ELEMENT_TMP)) /*对象成员*/
	{
	}
	else
	{
		printf ( "only var can BE l-value!!%d \n ",tmp->exp->A.type );
		exit ( 0 );
	}
    Var * l_value=IL_rt_Evaluate (tmp->exp->A);
    Var * r_value=IL_rt_Evaluate (tmp->exp->B);

    (*l_value)= assign_get(*l_value,*r_value,mode);
    set_tmp(tmp->tmp_index,l_value,TMP_ARITH);
    last_tmp_value=(*l_value);
}
Пример #7
0
/*在运行时解析对象成员指向运算*/
static void rt_eval_point_to(IL_node *tmp)
{
    if(tmp->exp->A.type!=ELEMENT_VAR && tmp->exp->A.type!=ELEMENT_API && tmp->exp->A.type!=ELEMENT_SELF
            &&  tmp->exp->A.type!=ELEMENT_TMP
            &&tmp->exp->A.type!=ELEMENT_LITERAL)
    {
        printf("doesn't support this kind of point operate,A : index %d    type %d \n",tmp->tmp_index,tmp->exp->A.type);
        exit(0);
    }
    Var *value_a, *value_b,*result;
    value_a=IL_rt_Evaluate ( tmp->exp->A );
    value_b=IL_rt_Evaluate ( tmp->exp->B );
    if(value_a->content.type==VAR_TYPE_STRUCT_NAME) /*类成员*/
    {
        /*判断访问性*/
        int acc=get_accessbility_of_member(value_a->content.var_value.struct_id,get_index_of_member(value_a->content.var_value.struct_id,var_GetMsg(*value_b)));
        if(acc!=STRUCT_PUBLIC && env_index != value_a->content.var_value.struct_id)/*非公有且在外部*/
        {
            printf("private member cannot be assinged outside\n");
            exit(0);
        }
        result =var_point_to (* value_a,*value_b);
		/*类成员,self指针失效,同时环境索引变为全局*/
        var_SetObjId (&self_ptr,env_index);
		self_ptr.content.type=VAR_TYPE_NILL;
	}
	else /*对象成员*/
	{

		/*判断访问性*/
        int acc=get_accessbility_of_member(var_GetObjId(value_a),get_index_of_member(var_GetObjId(value_a),var_GetMsg(*value_b)));
        if(acc!=STRUCT_PUBLIC && env_index != var_GetObjId(value_a))/*非公有且在外部*/
		{
            printf("private member cannot be assinged outside\n");
			exit(0);
		}
        result=var_point_to ( *value_a,*value_b );
		/*设置self指针*/
        self_ptr=* value_a;
	}
    set_tmp(tmp->tmp_index,result,TMP_DEREFER);
    last_tmp_value=(*result);
}
Пример #8
0
/*执行中间代码,输入一张中间代码表*/
Var IL_exec ( Function *func )
{
	/*记录当前函数所需的变量数量,为计算其嵌套调用函数时,虚拟机变量的偏移量*/
    vm_SetLayerVarAmount(vm_GetCurrentLayer() ,func->var_counts);
    IL_node * tmp;
    tmp=func->list.head;
	current_list=&func->list;
    while ( tmp!=NULL )
	{
        current_node=tmp;
        switch ( tmp->type )
		{
		case IL_NODE_PRNT:
			ExecPrintNode(last_tmp_value);
			break;
		case IL_NODE_EXP:
            handle_exp ( tmp );
			break;
		case IL_NODE_RETURN:
			return last_tmp_value;
			break;
        case IL_NODE_NILL:
            break;

        case IL_NODE_STRUCT_CREATOR:
        {
            IL_node * i=tmp->pre;
            int c=tmp->struct_creator->init_args;
            Var init_var[c];
            for(;c>0;c--)
            {
                init_var[c-1]= (*get_tmp (i->tmp_index));
                i=i->pre;
            }
            last_tmp_value =struct_Create(tmp->struct_creator->id,init_var,tmp->struct_creator->init_args);
            set_tmp (tmp->tmp_index,&last_tmp_value,TMP_DEREFER);
        }
            break;
        case IL_NODE_TUPLE_CREATOR:
        {
        last_tmp_value= tuple_CreateBySize (var_GetInt (last_tmp_value));
        set_tmp (tmp->tmp_index,&last_tmp_value,TMP_DEREFER);
        }
            break;
        case IL_NODE_GOTO:
		{
            int label=tmp->jmp->label;
            IL_node * node = tmp->next;
			while ( 1 )
			{
				if ( (node->type==IL_NODE_LAB) && (node->jmp->label==label ) )
				{
					break;
				}
				node=node->next;
			}
            tmp =node;
        }
            break;
        case IL_NODE_JE:
        {
            int can_jmp=0;
            if(var_GetType (last_tmp_value)==VAR_TYPE_BOOL)
            {
                if(var_GetBool (last_tmp_value)==0)
                {
                    can_jmp=1;
                }
            }
            else
            {
                STOP(" illegal je");
            }
            if ( can_jmp==1 )
            {
                int label =tmp->jmp->label;
                IL_node * node= tmp->next;
                while ( 1 )
                {
                    if ( (node->type==IL_NODE_LAB )&& (node->jmp->label==label)  )
                    {
                        break;
                    }
                    node=node->next;
                }
                tmp =node;
            }
        }
            break;
        case IL_NODE_CALL_LIST:
        {
            last_tmp_value =IL_CallFunc (tmp->call->args,tmp->call->list_id,FUNC_NORMAL);
            set_tmp (tmp->tmp_index,&last_tmp_value,TMP_ARITH);
        }
            break;
        case IL_NODE_CALL_API:
        {
            last_tmp_value=IL_CallFunc (tmp->call->args,tmp->call->list_id,FUNC_API);
            set_tmp (tmp->tmp_index,&last_tmp_value,TMP_ARITH);
        }
            break;
        case IL_NODE_CALL_DYNAMIC:
        {
            last_tmp_value =IL_CallFunc (tmp->call->args,tmp->call->list_id,FUNC_DYNAMIC);
            set_tmp (tmp->tmp_index,&last_tmp_value,TMP_ARITH);
        }
            break;
        case IL_NODE_CALL_METHOD:
        {
            last_tmp_value =IL_CallFunc (tmp->call->args,tmp->call->list_id,FUNC_METHOD);
            set_tmp (tmp->tmp_index,&last_tmp_value,TMP_ARITH);
        }
            break;
        case IL_NODE_CARD:
        {
            int card=tuple_GetCard(last_tmp_value);
            var_SetInt (&last_tmp_value,card);
            set_tmp (tmp->tmp_index,&last_tmp_value,TMP_ARITH);
        }
            break;
        case IL_NODE_TYPE_OF:
        {
            int type_of_var=var_GetType (last_tmp_value);
            var_SetInt (&last_tmp_value,type_of_var);
            set_tmp (tmp->tmp_index,&last_tmp_value,TMP_ARITH);
        }
            break;
        case IL_NODE_JNE:
        {
            int can_jmp=0;
            if(var_GetType (last_tmp_value)==VAR_TYPE_BOOL)
            {
                if(var_GetBool (last_tmp_value)!=0)
                {
                    can_jmp=1;
                }
            }
            else
            {
                STOP("illegal jne");
            }
			if ( can_jmp==1 )
			{
                int label = tmp->jmp->label;
                IL_node * node=tmp->pre;
				while ( 1 )
				{
					if ( (node->type==IL_NODE_LAB) &&(node->jmp->label==label))
					{
						break;
					}
					node=node->pre;
				}
                tmp=node;
			}
		}
		break;

        }
        tmp=tmp->next;
	}

	{
		Var result;
        var_SetInt (&result,0);
		return result;
	}
}