Index: ppapi/native_client/src/untrusted/pnacl_irt_shim/irt_shim_ppapi.c |
diff --git a/ppapi/native_client/src/untrusted/pnacl_irt_shim/irt_shim_ppapi.c b/ppapi/native_client/src/untrusted/pnacl_irt_shim/irt_shim_ppapi.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..eeca8cfcb3cf79d8f38c19d21413227a2da4beca |
--- /dev/null |
+++ b/ppapi/native_client/src/untrusted/pnacl_irt_shim/irt_shim_ppapi.c |
@@ -0,0 +1,79 @@ |
+/* |
+ * Copyright 2014 The Chromium Authors. All rights reserved. |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "ppapi/native_client/src/untrusted/pnacl_irt_shim/irt_shim_ppapi.h" |
+ |
+#include "native_client/src/untrusted/irt/irt.h" |
+#include "ppapi/nacl_irt/irt_ppapi.h" |
+#include "ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.h" |
+#include "ppapi/proxy/plugin_main_irt.h" |
+ |
+/* |
+ * Defines a version of the version irt_ppapi_start and of the irt_ppapihook |
+ * that returns a shimmed GetInterface for PNaCl. |
+ * |
+ * The hook will be linked into the IRT but it is considered unstable. |
+ * Stable nexes should not use that IRT hook (and a filter prevents |
+ * it from being used). Instead PNaCl nexes should embed the |
+ * irt_shim_ppapi_start and the shim functions directly into the nexe |
+ * for ABI stability. |
+ */ |
+ |
+static struct PP_StartFunctions g_user_start_functions; |
+ |
+static int32_t shim_PPPInitializeModule(PP_Module module_id, |
+ PPB_GetInterface get_browser_intf) { |
+ /* Record the original PPB_GetInterface and provide a shimmed one. */ |
+ __set_real_Pnacl_PPBGetInterface(get_browser_intf); |
+ return (*g_user_start_functions.PPP_InitializeModule)( |
+ module_id, |
+ &__Pnacl_PPBGetInterface); |
+} |
+ |
+static void shim_PPPShutdownModule() { |
+ (*g_user_start_functions.PPP_ShutdownModule)(); |
+} |
+ |
+#ifdef PNACL_SHIM_AOT |
+ /* |
+ * This will be discovered and set by the shim, since we cannot link |
+ * against the IRT directly in the AOT library. |
+ */ |
+int (*real_irt_ppapi_start)(const struct PP_StartFunctions *) = NULL; |
+#else |
+ /* |
+ * Otherwise, when linking directly into the IRT, we can refer to the |
+ * real irt_ppapi_start from irt_ppapi. |
+ */ |
+extern int irt_ppapi_start(const struct PP_StartFunctions *); |
+static int (* const real_irt_ppapi_start)(const struct PP_StartFunctions *) = |
+ &irt_ppapi_start; |
+#endif |
+ |
+int irt_shim_ppapi_start(const struct PP_StartFunctions *funcs) { |
+ g_user_start_functions = *funcs; |
+ /* |
+ * Record the original PPP_GetInterface and provide a shimmed one |
+ * via wrapped_ppapi_methods. |
+ */ |
+ const struct PP_StartFunctions wrapped_ppapi_methods = { |
+ shim_PPPInitializeModule, |
+ shim_PPPShutdownModule, |
+ __Pnacl_PPPGetInterface |
+ }; |
+ __set_real_Pnacl_PPPGetInterface(g_user_start_functions.PPP_GetInterface); |
+ /* |
+ * Invoke the IRT's ppapi_start interface with the wrapped interface. |
+ */ |
+ return (*real_irt_ppapi_start)(&wrapped_ppapi_methods); |
+} |
+ |
+#ifndef PNACL_SHIM_AOT |
+const struct nacl_irt_ppapihook nacl_irt_ppapihook_pnacl_private = { |
+ irt_shim_ppapi_start, |
+ PpapiPluginRegisterThreadCreator, |
+}; |
+#endif |