more code for message sending
This commit is contained in:
		| @ -1970,27 +1970,39 @@ static int prepare_new_context (hcl_t* hcl, hcl_oop_block_t rcv_blk, hcl_ooi_t n | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static HCL_INLINE int activate_block (hcl_t* hcl, hcl_ooi_t nargs, hcl_ooi_t nrvars) | static HCL_INLINE int __activate_block (hcl_t* hcl, hcl_oop_block_t op, hcl_ooi_t nargs, hcl_ooi_t nrvars, hcl_oop_context_t* pnewctx) | ||||||
| { | { | ||||||
| 	int x; | 	int x; | ||||||
| 	hcl_oop_block_t rcv; |  | ||||||
| 	hcl_oop_context_t newctx; |  | ||||||
|  |  | ||||||
| 	rcv = (hcl_oop_block_t)HCL_STACK_GETOP(hcl, nargs); | 	HCL_ASSERT (hcl, HCL_IS_BLOCK(hcl, op)); | ||||||
| 	HCL_ASSERT (hcl, HCL_IS_BLOCK(hcl, rcv)); |  | ||||||
|  |  | ||||||
| 	x = prepare_new_context( | 	x = prepare_new_context( | ||||||
| 		hcl, | 		hcl, | ||||||
| 		rcv, | 		op, | ||||||
| 		nargs, /* nargs */ | 		nargs, /* nargs */ | ||||||
| 		0, /* nargs_offset */ | 		0, /* nargs_offset */ | ||||||
| 		nrvars, | 		nrvars, | ||||||
| 		1, /* copy_args */ | 		1, /* copy_args */ | ||||||
| 		&newctx); | 		pnewctx); | ||||||
| 	if (HCL_UNLIKELY(x <= -1)) return -1; | 	if (HCL_UNLIKELY(x <= -1)) return -1; | ||||||
|  |  | ||||||
| 	HCL_STACK_POPS (hcl, nargs + 2); /* pop arguments, called block/function/method, and receiver */ | 	HCL_STACK_POPS (hcl, nargs + 2); /* pop arguments, called block/function/method, and receiver */ | ||||||
| 	newctx->sender = hcl->active_context; | 	(*pnewctx)->sender = hcl->active_context; | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static HCL_INLINE int activate_block (hcl_t* hcl, hcl_ooi_t nargs, hcl_ooi_t nrvars) | ||||||
|  | { | ||||||
|  | 	hcl_oop_block_t op; | ||||||
|  | 	hcl_oop_context_t newctx; | ||||||
|  | 	int x; | ||||||
|  |  | ||||||
|  | 	op = (hcl_oop_block_t)HCL_STACK_GETOP(hcl, nargs); | ||||||
|  | 	HCL_ASSERT (hcl, HCL_IS_BLOCK(hcl, op)); | ||||||
|  |  | ||||||
|  | 	x = __activate_block(hcl, op, nargs, nrvars, &newctx); | ||||||
|  | 	if (HCL_UNLIKELY(x <= -1)) return -1; | ||||||
|  |  | ||||||
| 	SWITCH_ACTIVE_CONTEXT (hcl, newctx); | 	SWITCH_ACTIVE_CONTEXT (hcl, newctx); | ||||||
| 	return 0; | 	return 0; | ||||||
| @ -2110,7 +2122,7 @@ static HCL_INLINE int call_primitive (hcl_t* hcl, hcl_ooi_t nargs) | |||||||
|  |  | ||||||
| /* ------------------------------------------------------------------------- */ | /* ------------------------------------------------------------------------- */ | ||||||
|  |  | ||||||
| static hcl_oop_function_t find_method_noseterr (hcl_t* hcl, hcl_oop_class_t class_, hcl_oop_t op) | static hcl_oop_block_t find_method_noseterr (hcl_t* hcl, hcl_oop_class_t class_, hcl_oop_t op) | ||||||
| { | { | ||||||
| 	hcl_oocs_t name; | 	hcl_oocs_t name; | ||||||
|  |  | ||||||
| @ -2122,21 +2134,23 @@ static hcl_oop_function_t find_method_noseterr (hcl_t* hcl, hcl_oop_class_t clas | |||||||
|  |  | ||||||
| 	do | 	do | ||||||
| 	{ | 	{ | ||||||
| 		hcl_oop_cons_t ass; | 		hcl_oop_t dic; | ||||||
|  |  | ||||||
| 		HCL_ASSERT (hcl, HCL_IS_NIL(hcl, class_->memdic) || HCL_IS_DIC(hcl, class_->memdic)); | 		dic = class_->memdic; | ||||||
|  | 		HCL_ASSERT (hcl, HCL_IS_NIL(hcl, dic) || HCL_IS_DIC(hcl, dic)); | ||||||
|  |  | ||||||
| 		if (HCL_LIKELY(!HCL_IS_NIL(hcl, class_->memdic))) | 		if (HCL_LIKELY(!HCL_IS_NIL(hcl, dic))) | ||||||
| 		{ | 		{ | ||||||
| 			ass = (hcl_oop_cons_t)hcl_lookupdicforsymbol_noseterr(hcl, class_->memdic, &name ); | 			hcl_oop_cons_t ass; | ||||||
| 			if (HCL_LIKELY(!ass)) | 			ass = (hcl_oop_cons_t)hcl_lookupdicforsymbol_noseterr(hcl, dic, &name); | ||||||
|  | 			if (HCL_LIKELY(ass)) | ||||||
| 			{ | 			{ | ||||||
| 				hcl_oop_t val; | 				hcl_oop_t val; | ||||||
| 				val = HCL_CONS_CDR(ass); | 				val = HCL_CONS_CDR(ass); | ||||||
| 				if (HCL_IS_FUNCTION(hcl, val)) | 				if (HCL_IS_BLOCK(hcl, val)) | ||||||
| 				{ | 				{ | ||||||
| 					/* TODO: futher check if it's a method */ | 					/* TODO: futher check if it's a method */ | ||||||
| 					return (hcl_oop_function_t)val; | 					return (hcl_oop_block_t)val; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| @ -2149,7 +2163,7 @@ static hcl_oop_function_t find_method_noseterr (hcl_t* hcl, hcl_oop_class_t clas | |||||||
|  |  | ||||||
| static HCL_INLINE int send_message (hcl_t* hcl, hcl_oop_t rcv, hcl_oop_t op, int to_super, hcl_ooi_t nargs) | static HCL_INLINE int send_message (hcl_t* hcl, hcl_oop_t rcv, hcl_oop_t op, int to_super, hcl_ooi_t nargs) | ||||||
| { | { | ||||||
| 	hcl_oop_function_t mth; | 	hcl_oop_block_t mth; | ||||||
| 	hcl_oop_context_t newctx; | 	hcl_oop_context_t newctx; | ||||||
| 	int x; | 	int x; | ||||||
|  |  | ||||||
| @ -2164,7 +2178,7 @@ static HCL_INLINE int send_message (hcl_t* hcl, hcl_oop_t rcv, hcl_oop_t op, int | |||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	x = __activate_function(hcl, mth, nargs, &newctx); | 	x = __activate_block(hcl, mth, nargs, 0 /* TODO: not 0 */ , &newctx); | ||||||
| 	if (HCL_UNLIKELY(x <= -1)) return -1; | 	if (HCL_UNLIKELY(x <= -1)) return -1; | ||||||
|  |  | ||||||
| 	SWITCH_ACTIVE_CONTEXT (hcl, newctx); | 	SWITCH_ACTIVE_CONTEXT (hcl, newctx); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user