Add try/throw
This commit is contained in:
		
							parent
							
								
									cc302bc17c
								
							
						
					
					
						commit
						6cce0e5595
					
				
							
								
								
									
										34
									
								
								ell.c
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								ell.c
									
									
									
									
									
								
							| @ -1044,6 +1044,38 @@ defn (fn_parse) { | |||||||
| 	return ok; | 	return ok; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | defn (fn_try) { | ||||||
|  | 	struct item *body = args, *handler; | ||||||
|  | 	if (!body || body->type != ITEM_LIST) | ||||||
|  | 		return set_error (ctx, "first argument must be a function"); | ||||||
|  | 	if (!(handler = body->next) || handler->type != ITEM_LIST) | ||||||
|  | 		return set_error (ctx, "second argument must be a function"); | ||||||
|  | 	if (execute (ctx, body->head, result)) | ||||||
|  | 		return true; | ||||||
|  | 
 | ||||||
|  | 	struct item *message; | ||||||
|  | 	if (ctx->memory_failure | ||||||
|  | 	 || !check (ctx, (message = new_string (ctx->error, strlen (ctx->error))))) | ||||||
|  | 		return false; | ||||||
|  | 
 | ||||||
|  | 	free (ctx->error); ctx->error = NULL; | ||||||
|  | 	item_free_list (*result); *result = NULL; | ||||||
|  | 
 | ||||||
|  | 	bool ok = set_single_argument (ctx, message) | ||||||
|  | 		&& execute (ctx, handler->head, result); | ||||||
|  | 	item_free (message); | ||||||
|  | 	return ok; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | defn (fn_throw) { | ||||||
|  | 	(void) result; | ||||||
|  | 
 | ||||||
|  | 	struct item *message = args; | ||||||
|  | 	if (!message || message->type != ITEM_STRING) | ||||||
|  | 		return set_error (ctx, "first argument must be string"); | ||||||
|  | 	return set_error (ctx, message->value); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| defn (fn_plus) { | defn (fn_plus) { | ||||||
| 	double res = 0.0; | 	double res = 0.0; | ||||||
| 	for (; args; args = args->next) { | 	for (; args; args = args->next) { | ||||||
| @ -1226,6 +1258,8 @@ init_runtime_library (struct context *ctx) { | |||||||
| 		&& native_register (ctx, "..",     fn_concatenate) | 		&& native_register (ctx, "..",     fn_concatenate) | ||||||
| 		&& native_register (ctx, "system", fn_system) | 		&& native_register (ctx, "system", fn_system) | ||||||
| 		&& native_register (ctx, "parse",  fn_parse) | 		&& native_register (ctx, "parse",  fn_parse) | ||||||
|  | 		&& native_register (ctx, "try",    fn_try) | ||||||
|  | 		&& native_register (ctx, "throw",  fn_throw) | ||||||
| 		&& native_register (ctx, "+",      fn_plus) | 		&& native_register (ctx, "+",      fn_plus) | ||||||
| 		&& native_register (ctx, "-",      fn_minus) | 		&& native_register (ctx, "-",      fn_minus) | ||||||
| 		&& native_register (ctx, "*",      fn_multiply) | 		&& native_register (ctx, "*",      fn_multiply) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user