Commit graph

17,090 commits

Author SHA1 Message Date
Eric Wing
f1c331f2c5 JavaScriptCore: Returning NULL for wrapper functions that expect JSValueRef may crash program.
According to this:
http://parmanoir.com/Taming_JavascriptCore_within_and_without_WebView
Returning NULL instead of an actual JSValueRef for a return value of a function could lead to crashes. I think I have seen related weirdness in the past when I failed to return a proper type to JSCore which resulted in very hard to understand behavior.

So this patch changes those return NULLs to return JSValueMakeUndefined().

I thought about JSObjectMakeError, but I don't fully understand the intent of the Error object and can't find any relevant real world examples of it being used. However, everybody seems to be using JSValueMakeUndefined().

This patch should be low impact since this is only triggered on an error condition.
2014-05-26 22:35:27 +02:00
Eric Wing
6f69555225 JavaScriptCore: Fixed exception object so sourceURL (file name), line (number), and message can be recovered.
The current implementation only returns an error string. But this is insufficient for debugging (what file and line number did it fail at?).

As documented here:
http://parmanoir.com/Taming_JavascriptCore_within_and_without_WebView
converting the JSValueRef of string to an JSObjectRef (via JSValueToObject) will trigger JSCore into filling the "sourceURL" and "line" properties into the object so they can be inspected by the caller.

Additionally, JavaScriptCore has a "message" property which contains the message string. JSCore doesn't seem to be filling this in for us automatically, unlike "sourceURL" and "line". So this patch also fills that property in too.

Thanks to Brian Barnes for the detailed information about "sourceURL", "line", and "message".

Below is an example (derived from Brian Barnes's information) on how you typically use/extract these exception details.

void script_exception_to_string(JSContextRef js_context,JSValueRef exception_value_ref,char* return_error_string, int return_error_string_max_length)
{
	JSObjectRef exception_object;
	JSValueRef value_ref;
	JSStringRef jsstring_property_name = NULL;
	JSValueRef temporary_exception = NULL;
	JSStringRef js_return_string = NULL;
	size_t bytes_needed;
	char* c_result_string = NULL;
	exception_object = JSValueToObject(js_context, exception_value_ref, NULL);
	// source and line numbers

	strcpy(return_error_string,"[");

	jsstring_property_name = JSStringCreateWithUTF8CString("sourceURL");
	value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
	JSStringRelease(jsstring_property_name);
	js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
	bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
	c_result_string = (char*)calloc(bytes_needed, sizeof(char));
	JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
	SDL_Log("c_result_string: %s\n", c_result_string);
	JSStringRelease(js_return_string);
	strncat(return_error_string, c_result_string, return_error_string_max_length-1);
	free(c_result_string);

	strncat(return_error_string, ":", return_error_string_max_length-1);

	jsstring_property_name = JSStringCreateWithUTF8CString("line");
	value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
	JSStringRelease(jsstring_property_name);
	js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
	bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
	c_result_string = (char*)calloc(bytes_needed, sizeof(char));
	JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
	SDL_Log("c_result_string: %s\n", c_result_string);
	JSStringRelease(js_return_string);
	strncat(return_error_string, c_result_string, return_error_string_max_length-1);
	//SDL_Log("c_result_string: %s\n", c_result_string);
	free(c_result_string);

	strncat(return_error_string, "]", return_error_string_max_length-1);

	/* get message */
	jsstring_property_name = JSStringCreateWithUTF8CString("message");
	value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
	JSStringRelease(jsstring_property_name);
	if(NULL == value_ref)
	{
		strncat(return_error_string, "Unknown Error", return_error_string_max_length-1);
	}
	else
	{
		js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
		bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
		c_result_string = (char*)calloc(bytes_needed, sizeof(char));
		JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
		SDL_Log("c_result_string: %s\n", c_result_string);
		JSStringRelease(js_return_string);
		strncat(return_error_string, c_result_string, return_error_string_max_length-1);
		//SDL_Log("c_result_string: %s\n", c_result_string);
		free(c_result_string);
	}
}

To use:
if(js_exception)
{
	char return_error_string[256];
	script_exception_to_string(js_context, js_exception, return_error_string, 256);
	SDL_Log("Compile error is %s", return_error_string);
}
2014-05-26 22:35:27 +02:00
Oliver Buchtala
01f8253b19 Javascript: added a section about known issues. 2014-05-26 21:38:00 +02:00
William S Fulton
55639cfff0 Merge branch 'hfalcic-master' - Python unicode surrogate escape strings
* hfalcic-master:
  unicode_strings test: manually check values instead of using assert
  unicode_strings_runme.py: fix version check
  unicode_strings test: check return values
  Python unicode_strings test case: restrict to Python > 3.0
  Python 3 'surrogateescape' docs: fix div class for Python code
2014-05-25 12:04:36 +01:00
William S Fulton
597c671e86 More diagnostics for csharp_exceptions testcase for diagnosing erratic failures 2014-05-25 12:00:42 +01:00
William S Fulton
4ab2eb96cd R examples building out-of-source
They still don't run though
2014-05-25 00:29:32 +01:00
William S Fulton
575ac1c170 Add 3.0.1 release notes summary 2014-05-25 00:03:19 +01:00
Harvey Falcic
91e93838fc unicode_strings test: manually check values instead of using assert 2014-05-24 18:00:04 -04:00
Harvey Falcic
ab527b0e4b unicode_strings_runme.py: fix version check
Python 3.0.1 shouldn't pass.
2014-05-24 17:57:16 -04:00
Harvey Falcic
2533d0210f unicode_strings test: check return values 2014-05-24 16:50:33 -04:00
Harvey Falcic
5c5dfc106f Python unicode_strings test case: restrict to Python > 3.0
Also adjust the test method names and content to match the docs.
2014-05-24 15:39:53 -04:00
Karl Wette
3e978fce9f Record files left over after maintainer-clean in Travis build 2014-05-24 20:25:56 +02:00
Karl Wette
bdc63e5a9f Remove example Makefiles when running distclean-examples in out-of-src build 2014-05-24 20:12:35 +02:00
Harvey Falcic
20ddfb7fcd Python 3 'surrogateescape' docs: fix div class for Python code 2014-05-24 13:30:03 -04:00
William S Fulton
d1f95ab6fd Merge pull request #165 from hfalcic/master
Python 3 byte string output: use errors="surrogateescape"
2014-05-24 17:54:55 +01:00
William S Fulton
8350288a6b Merge branch 'stricter-examples-compilation'
* stricter-examples-compilation:
  Travis testing - examples use stricter CFLAGS and CXXFLAGS
  Warning fixes in test-suite
  Refactor Lua class base search to make ISO c/c++ compliant
  Javascript warnings for c++98 - remove vla
  Fix compiler warnings in generated code when using -std=c++98 -std=gnu89 -pedantic -Wreturn-type
  Fix compiler warnings in examples when using -std=c++98 -std=gnu89 -pedantic -Wreturn-type
  Correct CFLAGS CXXFLAGS for Javascript and guile examples
2014-05-24 14:14:48 +01:00
William S Fulton
5990872cf7 Travis testing - examples use stricter CFLAGS and CXXFLAGS 2014-05-24 14:13:25 +01:00
William S Fulton
ab86f8a8f5 Warning fixes in test-suite 2014-05-24 14:13:24 +01:00
William S Fulton
10cbd2781f Refactor Lua class base search to make ISO c/c++ compliant 2014-05-24 14:13:24 +01:00
William S Fulton
c2368a40b2 Javascript warnings for c++98 - remove vla 2014-05-24 14:13:24 +01:00
William S Fulton
3191473523 Fix compiler warnings in generated code when using -std=c++98 -std=gnu89 -pedantic -Wreturn-type 2014-05-24 14:13:19 +01:00
William S Fulton
f39ed94419 Fix compiler warnings in examples when using -std=c++98 -std=gnu89 -pedantic -Wreturn-type 2014-05-24 13:13:32 +01:00
William S Fulton
879296f71b Correct CFLAGS CXXFLAGS for Javascript and guile examples 2014-05-24 13:13:32 +01:00
Olly Betts
1a0b8abec7 Fix comment typo 2014-05-24 11:11:51 +12:00
Olly Betts
8d3902a666 Work towards C90 compatibility for Lua 2014-05-24 11:10:57 +12:00
Harvey Falcic
5fc851a1e0 Add Python 3 'surrogateescape' documentation 2014-05-23 15:45:47 -04:00
Harvey Falcic
791f070e66 Add "unicode_strings" test case for new Python 3 behavior 2014-05-23 15:40:01 -04:00
Harvey Falcic
9846f3f1ea Python 3 byte string output: use errors="surrogateescape"
... if available on the version of Python that's in use. This allows
obtaining the original byte string (and potentially trying a fallback
encoding) if the bytes can't be decoded as UTF-8.

Previously, a UnicodeDecodeError would be raised with no way to treat
the data as bytes or try another codec.
2014-05-23 15:40:01 -04:00
William S Fulton
d9cac66462 Add missing entries into changes files. 2014-05-21 20:04:48 +01:00
William S Fulton
71e72c45ed Create separate extetnd.c file for handling extensions / %extend
This is just a simple code refactor, moving and function renaming to
remove the %extend code out of the parser into its own file now
 that it isn't just used in the parser.
2014-05-21 19:16:15 +01:00
William S Fulton
9e4bce051d Merge branch 'wkalinin-csymbols-1'
* wkalinin-csymbols-1:
  obscure case workaround in std::set wrapper, where ignored type still need to be processed
  global unnamed structures ignored
  test added for nested unnamed C struct %extend
  %extend for nested unnamed C structs
2014-05-20 18:10:41 +01:00
Oliver Buchtala
61b7da1671 JavascriptCore: Bugfix for null-pointer support.
This solution must be considered as a preliminary workaround.
2014-05-19 16:04:22 +02:00
Oliver Buchtala
3f0f588891 Javascript: support null pointers.
We allow to set pointer types using JS null.
2014-05-19 16:04:22 +02:00
Eric Wing
d5ea32d760 JavaScriptCore: ConvertPtr should allow JavaScript null to be a valid value.
It is common in C to accept NULL to functions for pointer parameters.
extern void DoSomething(struct Foo* foo);
...
DoSomething(NULL);

Thus, JavaScript null should be allowed:
module.DoSomething(null);

But the current ConvertPtr definition accepts only objects. This modifies it to allow null.
2014-05-19 16:04:22 +02:00
Oliver Buchtala
2471e4ad9f Javascript: Use RUNTOOL for running tests. 2014-05-19 12:11:15 +02:00
Oliver Buchtala
d9bb3a8415 Revert "JavaScriptCore: ConvertPtr should allow JavaScript null to be a valid value."
This reverts commit 05ed0325dc.
2014-05-19 11:46:29 +02:00
Oliver Buchtala
7cc617a19d Revert "Javascript: support null pointers."
This reverts commit 11963788e0.
2014-05-19 11:46:21 +02:00
Oliver Buchtala
394a8bebe7 Merge branch 'master' of https://github.com/swig/swig 2014-05-19 01:00:12 +02:00
Oliver Buchtala
a64549034c Javascript: generalise test-case 'typemap_variables' so that it can be used for Javascript V8.
The original version contains output typemaps that produced incompatible code.
Introduce a pre-processor macro that is set to a valid value for v8.
2014-05-19 00:58:32 +02:00
William S Fulton
243671700f Fix li_boost_intrusive_ptr for various versions of boost
Modify testcase to fix compile errors on various versions of boost.
Tested using various combinations from boost-1.33/gcc-3.4.2 to
boost-1.53/gcc-4.7.3. Originally noticed as broken on
boost-1.36/gcc-4.3.4 on SLE 11.

Add in some diagnostics when reference count is wrong... which does
still happen occasionally.
2014-05-18 23:29:06 +01:00
Oliver Buchtala
11963788e0 Javascript: support null pointers.
We allow to set pointer types using JS null.
2014-05-19 00:21:21 +02:00
Oliver Buchtala
0c42158723 Javascript: preparations for using Language::getNSpace(). 2014-05-19 00:20:19 +02:00
Vladimir Kalinin
d2ab75f907 obscure case workaround in std::set wrapper, where ignored type still need to be processed 2014-05-19 02:05:23 +04:00
Oliver Buchtala
7824322b14 Javascript: fix warnings in li_std_string test.
Old typemaps for std::string were in place instead of delegating to UTL.
2014-05-18 22:40:22 +02:00
Eric Wing
05ed0325dc JavaScriptCore: ConvertPtr should allow JavaScript null to be a valid value.
It is common in C to accept NULL to functions for pointer parameters.
extern void DoSomething(struct Foo* foo);
...
DoSomething(NULL);

Thus, JavaScript null should be allowed:
module.DoSomething(null);

But the current ConvertPtr definition accepts only objects. This modifies it to allow null.
2014-05-18 21:27:54 +02:00
Eric Wing
8498e4878d JavaScriptCore: More missing static modifiers. 2014-05-18 21:27:54 +02:00
Eric Wing
fade0bcbde JavaScriptCore: C89: declare variables at the top for antiquated compilers like Microsoft Visual Studio. 2014-05-18 21:27:54 +02:00
Eric Wing
486e903de1 JavaScriptCore: Bug fix for SWIGJSC_AppendOutput. This function requires a return value. I think it should be arr, but somebody should scrutinize this. 2014-05-18 21:27:54 +02:00
Oliver Buchtala
fcb4833660 JavascriptCore: fix cleanup code. 2014-05-18 21:27:54 +02:00
Eric Wing
b4534a481a JavaScriptCore: Bug fix for finalizer. The finalizer needs to be set on the objectDefinition, not the classDefinition. Otherwise, all the finalize callbacks get NULL back for the PrivateData and can't free the SwigPrivData, causing massive leakage. 2014-05-18 21:27:54 +02:00