Clean up in javascripttypemaps.swg.

- following the same layout/order as pytypemaps
- added typemaps for `long long` and `unsigned long long`, which are
  only copies of those for `long` and `unsigned long` and hence are
  just experimental.
This commit is contained in:
Oliver Buchtala 2013-09-09 17:34:53 +03:00
commit 407d8ef5ac
6 changed files with 287 additions and 53 deletions

View file

@ -0,0 +1,23 @@
/*
Create a file with this name, 'javascriptfragments.swg', in your working
directory and add all the %fragments you want to take precedence
over the default ones defined by swig.
For example, if you add:
%fragment(SWIG_AsVal_frag(int),"header") {
SWIGINTERNINLINE int
SWIG_AsVal(int)(PyObject *obj, int *val)
{
<your code here>;
}
}
this will replace the code used to retrieve an integer value for all
the typemaps that need it, including:
int, std::vector<int>, std::list<std::pair<int,int> >, etc.
*/

View file

@ -1,3 +1,9 @@
/* ------------------------------------------------------------
* Primitive Types
* ------------------------------------------------------------ */
/* boolean */
%fragment(SWIG_From_frag(bool),"header") { %fragment(SWIG_From_frag(bool),"header") {
SWIGINTERNINLINE SWIGINTERNINLINE
JSValueRef SWIG_From_dec(bool)(bool value) JSValueRef SWIG_From_dec(bool)(bool value)
@ -19,6 +25,8 @@ int SWIG_AsVal_dec(bool)(JSValueRef obj, bool *val)
} }
} }
/* int */
%fragment(SWIG_From_frag(int),"header") { %fragment(SWIG_From_frag(int),"header") {
SWIGINTERNINLINE JSValueRef SWIGINTERNINLINE JSValueRef
SWIG_From_dec(int)(int value) SWIG_From_dec(int)(int value)
@ -27,9 +35,11 @@ SWIGINTERNINLINE JSValueRef
} }
} }
/* long */
%fragment(SWIG_From_frag(long),"header") { %fragment(SWIG_From_frag(long),"header") {
SWIGINTERNINLINE JSValueRef SWIGINTERNINLINE JSValueRef
SWIG_From_dec(long)(long value) SWIG_From_dec(long)(long value)
{ {
return JSValueMakeNumber(context, value); return JSValueMakeNumber(context, value);
} }
@ -82,6 +92,68 @@ SWIG_AsVal_dec(unsigned long)(JSValueRef obj, unsigned long *val)
} }
} }
/* long long */
// Note: these are copied from 'long' and probably need fixing
%fragment(SWIG_From_frag(long long),"header") {
SWIGINTERNINLINE JSValueRef
SWIG_From_dec(long long)(long long value)
{
return JSValueMakeNumber(context, value);
}
}
%fragment(SWIG_AsVal_frag(long long),"header",
fragment="SWIG_CanCastAsInteger") {
SWIGINTERN int
SWIG_AsVal_dec(long long)(JSValueRef obj, long long* val)
{
if (!JSValueIsNumber(context, obj)) {
return SWIG_TypeError;
}
if(val) *val = (long long) JSValueToNumber(context, obj, NULL);
return SWIG_OK;
}
}
/* unsigned long long */
// Note: these are copied from 'unsigned long' and probably need fixing
%fragment(SWIG_From_frag(unsigned long long),"header",
fragment=SWIG_From_frag(long long),
fragment="<limits.h>") {
SWIGINTERN JSValueRef
SWIG_From_dec(unsigned long long)(unsigned long long value)
{
return (value > LONG_MAX) ?
JSValueMakeNumber(context, value) : JSValueMakeNumber(context, %numeric_cast(value,long));
}
}
%fragment(SWIG_AsVal_frag(unsigned long long),"header",
fragment="SWIG_CanCastAsInteger") {
SWIGINTERN int
SWIG_AsVal_dec(unsigned long long)(JSValueRef obj, unsigned long long *val)
{
if(!JSValueIsNumber(context, obj)) {
return SWIG_TypeError;
}
long long longVal = (unsigned long long) JSValueToNumber(context, obj, NULL);
if(longVal < 0) {
return SWIG_OverflowError;
}
if(val) *val = longVal;
return SWIG_OK;
}
}
/* double */
%fragment(SWIG_From_frag(double),"header") { %fragment(SWIG_From_frag(double),"header") {
SWIGINTERN JSValueRef SWIGINTERN JSValueRef
SWIG_From_dec(double) (double val) SWIG_From_dec(double) (double val)

View file

@ -1,21 +1,46 @@
/* ------------------------------------------------------------
* Typemap specializations for Javascript
* ------------------------------------------------------------ */
/* ------------------------------------------------------------
* Fragment section
* ------------------------------------------------------------ */
/* These macros are necessary to provide an extra parameter
to SWIG_AsVal_dec functions (JSContextRef context).
*/
#define SWIG_FROM_DECL_ARGS SWIG_JSC_FROM_DECL_ARGS #define SWIG_FROM_DECL_ARGS SWIG_JSC_FROM_DECL_ARGS
#define SWIG_FROM_CALL_ARGS SWIG_JSC_FROM_CALL_ARGS #define SWIG_FROM_CALL_ARGS SWIG_JSC_FROM_CALL_ARGS
#define SWIG_AS_DECL_ARGS SWIG_JSC_AS_DECL_ARGS #define SWIG_AS_DECL_ARGS SWIG_JSC_AS_DECL_ARGS
#define SWIG_AS_CALL_ARGS SWIG_JSC_AS_CALL_ARGS #define SWIG_AS_CALL_ARGS SWIG_JSC_AS_CALL_ARGS
#define SWIG_Object JSValueRef
#define VOID_Object JSValueMakeUndefined(context)
#define SWIG_AppendOutput(result, obj)
#define SWIG_SetConstant(name, obj)
#define SWIG_Raise(obj, type, desc) SWIG_Javascript_Raise(context, exception, type)
/* Include fundamental fragemt definitions */ /* Include fundamental fragemt definitions */
%include <typemaps/fragments.swg> %include <typemaps/fragments.swg>
/* Python fragments for fundamental types */ /* Look for user fragments file. */
%include <javascriptprimitives.swg> %include <javascriptfragments.swg>
/* Javascript fragments for fundamental types */
%include <javascriptprimtypes.swg>
/* Javascript fragments for char* strings */
%include <javascriptstrings.swg> %include <javascriptstrings.swg>
/* ------------------------------------------------------------
* Unified typemap section
* ------------------------------------------------------------ */
#define SWIG_Object JSValueRef
#define VOID_Object JSValueMakeUndefined(context)
/* append output */
#define SWIG_AppendOutput(result, obj)
/* set constant */
#define SWIG_SetConstant(name, obj)
/* raise */
#define SWIG_Raise(obj, type, desc) SWIG_Javascript_Raise(context, exception, type)
/* Include the unified typemap library */ /* Include the unified typemap library */
%include <typemaps/swigtypemaps.swg> %include <typemaps/swigtypemaps.swg>

View file

@ -0,0 +1,23 @@
/*
Create a file with this name, 'javascriptfragments.swg', in your working
directory and add all the %fragments you want to take precedence
over the default ones defined by swig.
For example, if you add:
%fragment(SWIG_AsVal_frag(int),"header") {
SWIGINTERNINLINE int
SWIG_AsVal(int)(PyObject *obj, int *val)
{
<your code here>;
}
}
this will replace the code used to retrieve an integer value for all
the typemaps that need it, including:
int, std::vector<int>, std::list<std::pair<int,int> >, etc.
*/

View file

@ -1,3 +1,9 @@
/* ------------------------------------------------------------
* Primitive Types
* ------------------------------------------------------------ */
/* boolean */
%fragment(SWIG_From_frag(bool),"header") { %fragment(SWIG_From_frag(bool),"header") {
SWIGINTERNINLINE SWIGINTERNINLINE
v8::Handle<v8::Value> v8::Handle<v8::Value>
@ -21,6 +27,8 @@ int SWIG_AsVal_dec(bool)(v8::Handle<v8::Value> obj, bool *val)
} }
} }
/* int */
%fragment(SWIG_From_frag(int),"header") { %fragment(SWIG_From_frag(int),"header") {
SWIGINTERNINLINE SWIGINTERNINLINE
v8::Handle<v8::Value> SWIG_From_dec(int)(int value) v8::Handle<v8::Value> SWIG_From_dec(int)(int value)
@ -42,6 +50,7 @@ int SWIG_AsVal_dec(int)(v8::Handle<v8::Value> valRef, int* val)
} }
} }
/* long */
%fragment(SWIG_From_frag(long),"header") { %fragment(SWIG_From_frag(long),"header") {
SWIGINTERNINLINE SWIGINTERNINLINE
@ -98,6 +107,67 @@ int SWIG_AsVal_dec(unsigned long)(v8::Handle<v8::Value> obj, unsigned long *val)
} }
} }
/* long long */
// Note: these are copied from 'long' and probably need fixing
%fragment(SWIG_From_frag(long long),"header") {
SWIGINTERNINLINE
v8::Handle<v8::Value> SWIG_From_dec(long long)(long long value)
{
return v8::Number::New(value);
}
}
%fragment(SWIG_AsVal_frag(long long),"header",
fragment="SWIG_CanCastAsInteger") {
SWIGINTERN
int SWIG_AsVal_dec(long)(v8::Handle<v8::Value> obj, long long* val)
{
if (!obj->IsNumber()) {
return SWIG_TypeError;
}
if(val) *val = (long long) obj->IntegerValue();
return SWIG_OK;
}
}
/* unsigned long long */
// Note: these are copied from 'unsigned long' and probably need fixing
%fragment(SWIG_From_frag(unsigned long long),"header",
fragment=SWIG_From_frag(long long)) {
SWIGINTERNINLINE
v8::Handle<v8::Value> SWIG_From_dec(unsigned long long)(unsigned long long value)
{
return (value > LONG_MAX) ?
v8::Integer::NewFromUnsigned(value) : v8::Integer::New(%numeric_cast(value,long));
}
}
%fragment(SWIG_AsVal_frag(unsigned long long),"header",
fragment="SWIG_CanCastAsInteger") {
SWIGINTERN
int SWIG_AsVal_dec(unsigned long)(v8::Handle<v8::Value> obj, unsigned long long *val)
{
if(!obj->IsNumber()) {
return SWIG_TypeError;
}
long long longVal = (long long) obj->NumberValue();
if(longVal < 0) {
return SWIG_OverflowError;
}
if(val) *val = longVal;
return SWIG_OK;
}
}
/* double */
%fragment(SWIG_From_frag(double),"header") { %fragment(SWIG_From_frag(double),"header") {
SWIGINTERN SWIGINTERN
v8::Handle<v8::Value> SWIG_From_dec(double) (double val) v8::Handle<v8::Value> SWIG_From_dec(double) (double val)
@ -119,9 +189,3 @@ int SWIG_AsVal_dec(double)(v8::Handle<v8::Value> obj, double *val)
} }
} }
%typemap(in) char *
%{
v8::String::Utf8Value _$1($input);
$1 = *_$1;
%}

View file

@ -1,16 +1,43 @@
#define SWIG_Object v8::Handle<v8::Value> /* ------------------------------------------------------------
#define VOID_Object v8::Undefined() * Typemap specializations for Javascript
#define SWIG_AppendOutput(result, obj) * ------------------------------------------------------------ */
#define SWIG_SetConstant(name, obj)
#define SWIG_Raise(obj, type, desc) SWIG_V8_Raise(type) /* ------------------------------------------------------------
* Fragment section
* ------------------------------------------------------------ */
/* Include fundamental fragemt definitions */ /* Include fundamental fragemt definitions */
%include <typemaps/fragments.swg> %include <typemaps/fragments.swg>
/* Python fragments for fundamental types */ /* Look for user fragments file. */
%include <javascriptprimitives.swg> %include <javascriptfragments.swg>
/* Javascript fragments for fundamental types */
%include <javascriptprimtypes.swg>
/* Javascript fragments for char* strings */
%include <javascriptstrings.swg> %include <javascriptstrings.swg>
/* ------------------------------------------------------------
* Unified typemap section
* ------------------------------------------------------------ */
/* Javascript types */
#define SWIG_Object v8::Handle<v8::Value>
#define VOID_Object v8::Undefined()
/* Overload of the output/constant/exception/dirout handling */
/* append output */
#define SWIG_AppendOutput(result, obj)
/* set constant */
#define SWIG_SetConstant(name, obj)
/* raise */
#define SWIG_Raise(obj, type, desc) SWIG_V8_Raise(type)
/* Include the unified typemap library */ /* Include the unified typemap library */
%include <typemaps/swigtypemaps.swg> %include <typemaps/swigtypemaps.swg>