[RFC] Single threaded JSRuntime in Firefox 10
Thomas Meyer
thomas at m3y3r.de
Fri Feb 3 17:11:02 PST 2012
Hello,
please have a look at this first patch that fixes the sendMember() and
eval() methods for firefox 10:
# HG changeset patch
# User thomas
# Date 1328317526 -3600
# Node ID 6962b636cfdaeef1efa884bcd2207a1360baa978
# Parent 528e354ff46919a758c8977978053fbb816ffebc
Fix eval() and sendMember() for the new single thread JSRuntime in Firefox 10. See also:
- https://bugzilla.mozilla.org/show_bug.cgi?id=704249
- http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=820
- http://groups.google.com/group/mozilla.dev.tech.js-engine/msg/ae5f22f39e4fd150
diff -r 528e354ff469 -r 6962b636cfda plugin/icedteanp/IcedTeaPluginRequestProcessor.cc
--- a/plugin/icedteanp/IcedTeaPluginRequestProcessor.cc Thu Feb 02 16:15:27 2012 -0500
+++ b/plugin/icedteanp/IcedTeaPluginRequestProcessor.cc Sat Feb 04 02:05:26 2012 +0100
@@ -241,19 +241,9 @@
IcedTeaPluginUtilities::callAndWaitForResult(instance, &_eval, &thread_data);
- NPVariant* result_variant = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(thread_data.result);
- std::string result_variant_jniid = std::string();
- if (result_variant)
- {
- createJavaObjectFromVariant(instance, *result_variant, &result_variant_jniid);
- } else
- {
- result_variant_jniid = "0";
- }
-
IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response);
response += " JavaScriptEval ";
- response += result_variant_jniid;
+ response += thread_data.result;
plugin_to_java_bus->post(response.c_str());
}
@@ -522,7 +512,7 @@
/** Request data from Java if necessary **/
if (*(message_parts->at(4)) == "GetSlot")
{
- member_identifier = browser_functions.getintidentifier(atoi(member_id.c_str()));
+ //member_id = ;
} else
{
// make a new request for getString, to get the name of the identifier
@@ -535,7 +525,7 @@
//goto cleanup;
}
- member_identifier = browser_functions.getstringidentifier(java_result->return_string->c_str());
+ member_id = *java_result->return_string;
}
AsyncCallThreadData thread_data = AsyncCallThreadData();
@@ -551,16 +541,10 @@
thread_data.parameters.push_back(instance);
thread_data.parameters.push_back(NPVARIANT_TO_OBJECT(*parent_ptr));
- thread_data.parameters.push_back(&member_identifier);
+ thread_data.parameters.push_back(&member_id);
IcedTeaPluginUtilities::callAndWaitForResult(instance, &_getMember, &thread_data);
- PLUGIN_DEBUG("Member PTR after internal request: %s\n", thread_data.result.c_str());
-
- member_ptr = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(thread_data.result);
-
- createJavaObjectFromVariant(instance, *member_ptr, &result_id);
-
IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response);
if (*(message_parts->at(4)) == "GetSlot")
{
@@ -568,7 +552,7 @@
} else {
response.append(" JavaScriptGetMember ");
}
- response.append(result_id.c_str());
+ response.append(thread_data.result);
plugin_to_java_bus->post(response.c_str());
}
@@ -797,23 +781,27 @@
instance = (NPP) parameters.at(0);
parent_ptr = (NPObject*) parameters.at(1);
- NPIdentifier* member_identifier = (NPIdentifier*) parameters.at(2);
+ std::string* member_id = (std::string*) parameters.at(2);
+ NPIdentifier member_identifier;
+
+ member_identifier = browser_functions.getintidentifier(atoi(member_id->c_str()));
// Get the NPVariant corresponding to this member
- PLUGIN_DEBUG("Looking for %p %p %p (%s)\n", instance, parent_ptr, member_identifier, browser_functions.utf8fromidentifier(*member_identifier));
+ PLUGIN_DEBUG("Looking for %p %p %p (%s)\n", instance, parent_ptr, member_identifier, browser_functions.utf8fromidentifier(member_identifier));
- if (!browser_functions.hasproperty(instance, parent_ptr, *member_identifier))
+ if (!browser_functions.hasproperty(instance, parent_ptr, member_identifier))
{
- printf("%s not found!\n", browser_functions.utf8fromidentifier(*member_identifier));
+ printf("%s not found!\n", browser_functions.utf8fromidentifier(member_identifier));
}
- ((AsyncCallThreadData*) data)->call_successful = browser_functions.getproperty(instance, parent_ptr, *member_identifier, member_ptr);
+ ((AsyncCallThreadData*) data)->call_successful = browser_functions.getproperty(instance, parent_ptr, member_identifier, member_ptr);
IcedTeaPluginUtilities::printNPVariant(*member_ptr);
if (((AsyncCallThreadData*) data)->call_successful)
{
- IcedTeaPluginUtilities::JSIDToString(member_ptr, &member_ptr_str);
+ createJavaObjectFromVariant(instance, *member_ptr, &member_ptr_str);
((AsyncCallThreadData*) data)->result.append(member_ptr_str);
+
}
((AsyncCallThreadData*) data)->result_ready = true;
@@ -831,8 +819,8 @@
std::string* script_str;
NPIdentifier script_identifier;
NPString script = NPString();
- NPVariant* eval_result = new NPVariant();
- std::string eval_result_ptr_str = std::string();
+ NPVariant* eval_variant = new NPVariant();
+ std::string eval_variant_str = std::string();
PLUGIN_DEBUG("_eval called\n");
@@ -854,13 +842,19 @@
PLUGIN_DEBUG("Evaluating: %s\n", script.UTF8Characters);
#endif
- ((AsyncCallThreadData*) data)->call_successful = browser_functions.evaluate(instance, window_ptr, &script, eval_result);
- IcedTeaPluginUtilities::printNPVariant(*eval_result);
+ ((AsyncCallThreadData*) data)->call_successful = browser_functions.evaluate(instance, window_ptr, &script, eval_variant);
+ IcedTeaPluginUtilities::printNPVariant(*eval_variant);
if (((AsyncCallThreadData*) data)->call_successful)
{
- IcedTeaPluginUtilities::JSIDToString(eval_result, &eval_result_ptr_str);
- ((AsyncCallThreadData*) data)->result.append(eval_result_ptr_str);
+ if (eval_variant)
+ {
+ createJavaObjectFromVariant(instance, *eval_variant, &eval_variant_str);
+ } else
+ {
+ eval_variant_str = "0";
+ }
+ ((AsyncCallThreadData*) data)->result.append(eval_variant_str);
}
((AsyncCallThreadData*) data)->result_ready = true;
More information about the distro-pkg-dev
mailing list