Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Side by Side Diff: runtime/include/dart_api.h

Issue 1663613002: Dart_SetReturnValue now accepts and propagates error handles. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | runtime/vm/dart_api_impl.h » ('j') | runtime/vm/native_entry.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 2 * Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
3 * for details. All rights reserved. Use of this source code is governed by a 3 * for details. All rights reserved. Use of this source code is governed by a
4 * BSD-style license that can be found in the LICENSE file. 4 * BSD-style license that can be found in the LICENSE file.
5 */ 5 */
6 6
7 #ifndef INCLUDE_DART_API_H_ 7 #ifndef INCLUDE_DART_API_H_
8 #define INCLUDE_DART_API_H_ 8 #define INCLUDE_DART_API_H_
9 9
10 /** \mainpage Dart Embedding API Reference 10 /** \mainpage Dart Embedding API Reference
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 * normal fatal error. 137 * normal fatal error.
138 * 138 *
139 * --- Propagating errors --- 139 * --- Propagating errors ---
140 * 140 *
141 * When an error handle is returned from the top level invocation of 141 * When an error handle is returned from the top level invocation of
142 * Dart code in a program, the embedder must handle the error as they 142 * Dart code in a program, the embedder must handle the error as they
143 * see fit. Often, the embedder will print the error message produced 143 * see fit. Often, the embedder will print the error message produced
144 * by Dart_Error and exit the program. 144 * by Dart_Error and exit the program.
145 * 145 *
146 * When an error is returned while in the body of a native function, 146 * When an error is returned while in the body of a native function,
147 * it can be propagated by calling Dart_PropagateError. Errors should 147 * it can be propagated up the call stack by calling
148 * be propagated unless there is a specific reason not to. If an 148 * Dart_PropagateError, Dart_SetReturnValue, or Dart_ThrowException.
149 * error is not propagated then it is ignored. For example, if an 149 * Errors should be propagated unless there is a specific reason not
150 * unhandled exception error is ignored, that effectively "catches" 150 * to. If an error is not propagated then it is ignored. For
151 * the unhandled exception. Fatal errors must always be propagated. 151 * example, if an unhandled exception error is ignored, that
152 * effectively "catches" the unhandled exception. Fatal errors must
153 * always be propagated.
152 * 154 *
153 * Note that a call to Dart_PropagateError never returns. Instead it 155 * When an error is propagated, any current scopes created by
154 * transfers control non-locally using a setjmp-like mechanism. This 156 * Dart_EnterScope will be exited.
155 * can be inconvenient if you have resources that you need to clean up
156 * before propagating the error. When an error is propagated, any
157 * current scopes created by Dart_EnterScope will be exited.
158 * 157 *
159 * To deal with this inconvenience, we often return error handles 158 * Dart_PropagateError and Dart_ThrowException do not return. Instead
159 * they transfer control non-locally using a setjmp-like mechanism.
160 * This can be inconvenient if you have resources that you need to
161 * clean up before propagating the error.
162 *
163 * When relying on Dart_PropagateError, we often return error handles
160 * rather than propagating them from helper functions. Consider the 164 * rather than propagating them from helper functions. Consider the
161 * following contrived example: 165 * following contrived example:
162 * 166 *
163 * 1 Dart_Handle isLongStringHelper(Dart_Handle arg) { 167 * 1 Dart_Handle isLongStringHelper(Dart_Handle arg) {
164 * 2 intptr_t* length = 0; 168 * 2 intptr_t* length = 0;
165 * 3 result = Dart_StringLength(arg, &length); 169 * 3 result = Dart_StringLength(arg, &length);
166 * 4 if (Dart_IsError(result)) { 170 * 4 if (Dart_IsError(result)) {
167 * 5 return result 171 * 5 return result
168 * 6 } 172 * 6 }
169 * 7 return Dart_NewBoolean(length > 100); 173 * 7 return Dart_NewBoolean(length > 100);
(...skipping 14 matching lines...) Expand all
184 * 22 Dart_ExitScope(); 188 * 22 Dart_ExitScope();
185 * 23 } 189 * 23 }
186 * 190 *
187 * In this example, we have a native function which calls a helper 191 * In this example, we have a native function which calls a helper
188 * function to do its work. On line 5, the helper function could call 192 * function to do its work. On line 5, the helper function could call
189 * Dart_PropagateError, but that would not give the native function a 193 * Dart_PropagateError, but that would not give the native function a
190 * chance to call FreeMyResource(), causing a leak. Instead, the 194 * chance to call FreeMyResource(), causing a leak. Instead, the
191 * helper function returns the error handle to the caller, giving the 195 * helper function returns the error handle to the caller, giving the
192 * caller a chance to clean up before propagating the error handle. 196 * caller a chance to clean up before propagating the error handle.
193 * 197 *
198 * When an error is propagated by calling Dart_SetReturnValue, the
199 * native function will be allowed to complete normally and then the
200 * exception will be propagated only once the native call
201 * returns. This can be convenient, as it allows the C code to clean
202 * up normally.
203 *
204 * The example can be written more simply using Dart_SetReturnValue to
205 * propagate the error.
206 *
207 * 1 Dart_Handle isLongStringHelper(Dart_Handle arg) {
208 * 2 intptr_t* length = 0;
209 * 3 result = Dart_StringLength(arg, &length);
210 * 4 if (Dart_IsError(result)) {
211 * 5 return result
212 * 6 }
213 * 7 return Dart_NewBoolean(length > 100);
214 * 8 }
215 * 9
216 * 10 void NativeFunction_isLongString(Dart_NativeArguments args) {
217 * 11 Dart_EnterScope();
218 * 12 AllocateMyResource();
219 * 13 Dart_Handle arg = Dart_GetNativeArgument(args, 0);
220 * 14 Dart_SetReturnValue(isLongStringHelper(arg));
221 * 15 FreeMyResource();
222 * 16 Dart_ExitScope();
223 * 17 }
224 *
225 * In this example, the call to Dart_SetReturnValue on line 14 will
226 * either return the normal return value or propagate the error result
siva 2016/02/03 16:50:00 The wording 'propagate the error' seems to imply t
turnidge 2016/02/03 19:13:46 Done.
227 * (potentially generated on line 3). The call to FreeMyResource on
228 * line 15 will execute in either case.
229 *
194 * --- Local and persistent handles --- 230 * --- Local and persistent handles ---
195 * 231 *
196 * Local handles are allocated within the current scope (see 232 * Local handles are allocated within the current scope (see
197 * Dart_EnterScope) and go away when the current scope exits. Unless 233 * Dart_EnterScope) and go away when the current scope exits. Unless
198 * otherwise indicated, callers should assume that all functions in 234 * otherwise indicated, callers should assume that all functions in
199 * the Dart embedding api return local handles. 235 * the Dart embedding api return local handles.
200 * 236 *
201 * Persistent handles are allocated within the current isolate. They 237 * Persistent handles are allocated within the current isolate. They
202 * can be used to store objects across scopes. Persistent handles have 238 * can be used to store objects across scopes. Persistent handles have
203 * the lifetime of the current isolate unless they are explicitly 239 * the lifetime of the current isolate unless they are explicitly
(...skipping 1932 matching lines...) Expand 10 before | Expand all | Expand 10 after
2136 * uses with Dart_NewUnhandledExceptionError. */ 2172 * uses with Dart_NewUnhandledExceptionError. */
2137 2173
2138 /** 2174 /**
2139 * Throws an exception. 2175 * Throws an exception.
2140 * 2176 *
2141 * This function causes a Dart language exception to be thrown. This 2177 * This function causes a Dart language exception to be thrown. This
2142 * will proceed in the standard way, walking up Dart frames until an 2178 * will proceed in the standard way, walking up Dart frames until an
2143 * appropriate 'catch' block is found, executing 'finally' blocks, 2179 * appropriate 'catch' block is found, executing 'finally' blocks,
2144 * etc. 2180 * etc.
2145 * 2181 *
2182 * If an error handle is passed into this function, the error is
2183 * propagated immediately. See Dart_PropagateError for a discussion
2184 * of error propagation.
2185 *
2146 * If successful, this function does not return. Note that this means 2186 * If successful, this function does not return. Note that this means
2147 * that the destructors of any stack-allocated C++ objects will not be 2187 * that the destructors of any stack-allocated C++ objects will not be
2148 * called. If there are no Dart frames on the stack, an error occurs. 2188 * called. If there are no Dart frames on the stack, an error occurs.
2149 * 2189 *
2150 * \return An error handle if the exception was not thrown. 2190 * \return An error handle if the exception was not thrown.
2151 * Otherwise the function does not return. 2191 * Otherwise the function does not return.
2152 */ 2192 */
2153 DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception); 2193 DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception);
2154 2194
2155 /** 2195 /**
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
2373 * \param arg_index Index of the desired argument in the structure above. 2413 * \param arg_index Index of the desired argument in the structure above.
2374 * \param value Returns the double value if the argument is a double. 2414 * \param value Returns the double value if the argument is a double.
2375 * \return Success if no error occurs. Otherwise returns an error handle. 2415 * \return Success if no error occurs. Otherwise returns an error handle.
2376 */ 2416 */
2377 DART_EXPORT Dart_Handle Dart_GetNativeDoubleArgument(Dart_NativeArguments args, 2417 DART_EXPORT Dart_Handle Dart_GetNativeDoubleArgument(Dart_NativeArguments args,
2378 int index, 2418 int index,
2379 double* value); 2419 double* value);
2380 2420
2381 /** 2421 /**
2382 * Sets the return value for a native function. 2422 * Sets the return value for a native function.
2423 *
2424 * If retval is an Error handle, then error will be propagated once
2425 * the native functions exits. See Dart_PropagateError for a
2426 * discussion of how different types of errors are propagated.
siva 2016/02/03 16:50:00 I think the obvious question that comes up is when
turnidge 2016/02/03 19:13:46 Yes. I've added this paragraph to the discussion
2383 */ 2427 */
2384 DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args, 2428 DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args,
2385 Dart_Handle retval); 2429 Dart_Handle retval);
2386 2430
2387 DART_EXPORT void Dart_SetWeakHandleReturnValue(Dart_NativeArguments args, 2431 DART_EXPORT void Dart_SetWeakHandleReturnValue(Dart_NativeArguments args,
2388 Dart_WeakPersistentHandle rval); 2432 Dart_WeakPersistentHandle rval);
2389 2433
2390 DART_EXPORT void Dart_SetBooleanReturnValue(Dart_NativeArguments args, 2434 DART_EXPORT void Dart_SetBooleanReturnValue(Dart_NativeArguments args,
2391 bool retval); 2435 bool retval);
2392 2436
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after
2805 intptr_t* vm_isolate_snapshot_size, 2849 intptr_t* vm_isolate_snapshot_size,
2806 uint8_t** isolate_snapshot_buffer, 2850 uint8_t** isolate_snapshot_buffer,
2807 intptr_t* isolate_snapshot_size, 2851 intptr_t* isolate_snapshot_size,
2808 uint8_t** instructions_snapshot_buffer, 2852 uint8_t** instructions_snapshot_buffer,
2809 intptr_t* instructions_snapshot_size); 2853 intptr_t* instructions_snapshot_size);
2810 2854
2811 2855
2812 DART_EXPORT bool Dart_IsRunningPrecompiledCode(); 2856 DART_EXPORT bool Dart_IsRunningPrecompiledCode();
2813 2857
2814 #endif /* INCLUDE_DART_API_H_ */ /* NOLINT */ 2858 #endif /* INCLUDE_DART_API_H_ */ /* NOLINT */
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/dart_api_impl.h » ('j') | runtime/vm/native_entry.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698