51static int js_run_version = JS_VERSION;
54#define STRING_SIZE 256
58#define jsuint uint32_t
60#define jsdouble double
62#define JS_FinalizeStub NULL
63#define JS_GET_CLASS JS_GetClassFw
64JSBool JS_NewNumberValue(JSContext *cx, jsdouble d, jsval *rval);
71#define JS_GET_PROPERTY_STUB JS_PropertyStub
74#define JS_SET_PROPERTY_STUB1 js_SetPropertyDebug1
77# define JS_SET_PROPERTY_STUB2 JS_StrictPropertyStub
78#define JS_SET_PROPERTY_STUB3 js_SetPropertyDebug3
87#include "scenegraph/Vector.h"
105#include "../vrml_parser/Structs.h"
117#include "../vrml_parser/CRoutes.h"
120void Parser_scanStringValueToMem_B(
union anyVrml* any, indexT ctype,
const char *value,
int isXML);
121int getJsEngineVariant();
126#include "jsVRMLBrowser_sm.h"
128#include "jsUtils_sm.h"
129#include "jsVRMLClasses_sm.h"
132#ifndef JSCLASS_GLOBAL_FLAGS
134#define JSCLASS_GLOBAL_FLAGS 0
137#ifdef JAVASCRIPTVERBOSE
138int ActualrunScript(
int num,
char *script, jsval *rval,
char *fn,
int line);
140int ActualrunScript(
int num,
char *script, jsval *rval);
144static JSClass staticGlobalClass = {
146 JSCLASS_GLOBAL_FLAGS,
149 JS_DeletePropertyStub,
154 JS_StrictPropertyStub,
174typedef struct pJScript{
177 jsval JSglobal_return_value;
178 struct Shader_Script *current_script;
182void *JScript_constructor(){
183 void *v = MALLOCV(
sizeof(
struct pJScript));
184 memset(v,0,
sizeof(
struct pJScript));
189void JScript_init(
struct iiglobal::tJScript *t){
191 t->JSglobal_return_val = NULL;
193 t->prv = JScript_constructor();
195 ppJScript p = (ppJScript)t->prv;
198 memcpy(&p->globalClass,&staticGlobalClass,
sizeof(staticGlobalClass));
199 t->JSglobal_return_val = &p->JSglobal_return_value;
200 p->current_script = NULL;
216static int DEBUG_SM = 0;
217void FW_MaybeGC(
char* note,JSContext * cx) {
221 ttglobal tg = gglobal();
222 ppJScript p = (ppJScript)tg->JScript.prv;
223 printf(
"<%s ", note);
228void My_JSGCCallback(JSRuntime* rt, JSGCStatus status) {
229 if(DEBUG_SM) printf(
"GC %d ", (
int)status);
232void sm_js_cleanup_script_context(
int counter){
233 ttglobal tg = gglobal();
234 ppJScript p = (ppJScript)tg->JScript.prv;
238 cx = (JSContext *)getScriptControlIndex(counter)->cx;
239 global = (JSObject *)getScriptControlIndex(counter)->glob;
242 JSAutoRequest ar(cx);
245 JSAutoCompartment ac(cx, global);
266void sm_process_eventsProcessed() {
271 ttglobal tg = gglobal();
272 ppJScript p = (ppJScript)tg->JScript.prv;
273 for (counter = 0; counter <= tg->CRoutes.max_script_found_and_initialized; counter++) {
274 scriptcontrol = getScriptControlIndex(counter);
275 if(scriptcontrol->thisScriptType != NOSCRIPT ){
276 JSContext *cx = (JSContext *)scriptcontrol->cx;
277 JSObject *obj = (JSObject *)scriptcontrol->glob;
280 JSAutoRequest ar(cx);
283 JSAutoCompartment ac(cx, obj);
288 FW_MaybeGC(
"E0", cx);
290 if (scriptcontrol->eventsProcessed == NULL || TRUE) {
291 scriptcontrol->eventsProcessed = (
void *)JS_CompileScript(cx,obj,
"eventsProcessed(__eventInTickTime)", strlen (
"eventsProcessed(__eventInTickTime)"),
292 "compile eventsProcessed()", 1);
293 if(0)
if (!JS_AddObjectRoot(cx,(JSObject**)(&scriptcontrol->eventsProcessed))) {
294 printf (
"can not add object root for compiled eventsProcessed() for script %d\n",counter);
297 FW_MaybeGC(
"E1", cx);
304 if (!JS_ExecuteScript(cx,obj,(JSScript *)scriptcontrol->eventsProcessed, &retval)) {
305 printf (
"can not run eventsProcessed() for script %d\n",counter);
307 FW_MaybeGC(
"E2", cx);
322void sm_jsClearScriptControlEntries(
int num)
325 ScriptControl = getScriptControlIndex(num);
326 if (ScriptControl->eventsProcessed != NULL) {
328 if (ScriptControl->cx != NULL) {
329 JS_RemoveObjectRoot((JSContext *)ScriptControl->cx,(JSObject**)(&ScriptControl->eventsProcessed));
332 ScriptControl->eventsProcessed = NULL;
342#define MAX_RUNTIME_BYTES 0x4000000L
347#define STACK_CHUNK_SIZE 8192
349static int JSaddGlobalECMANativeProperty(
int num,
const char *name);
350static int JSaddGlobalAssignProperty(
int num,
const char *name,
const char *str);
385static char *DefaultScriptMethods =
"function initialize() {}; " \
386 " function shutdown() {}; " \
387 " function eventsProcessed() {}; " \
388 " TRUE=true; FALSE=false; " \
389 " function print(x) {Browser.print(x)}; " \
390 " function println(x) {Browser.println(x)}; " \
391 " function getName() {return Browser.getName()}; "\
392 " function getVersion() {return Browser.getVersion()}; "\
393 " function getCurrentSpeed() {return Browser.getCurrentSpeed()}; "\
394 " function getCurrentFrameRate() {return Browser.getCurrentFrameRate()}; "\
395 " function getWorldURL() {return Browser.getWorldURL()}; "\
396 " function replaceWorld(x) {Browser.replaceWorld(x)}; "\
397 " function loadURL(x,y) {Browser.loadURL(x,y)}; "\
398 " function setDescription(x) {Browser.setDescription(x)}; "\
399 " function createVrmlFromString(x) {Browser.createVrmlFromString(x)}; "\
400 " function createVrmlFromURL(x,y,z) {Browser.createVrmlFromURL(x,y,z)}; "\
401 " function createX3DFromString(x) {Browser.createX3DFromString(x)}; "\
402 " function createX3DFromURL(x,y,z) {Browser.createX3DFromURL(x,y,z)}; "\
403 " function addRoute(a,b,c,d) {Browser.addRoute(a,b,c,d)}; "\
404 " function deleteRoute(a,b,c,d) {Browser.deleteRoute(a,b,c,d)}; "\
405 " function _rename_function(obj,oldf,newf) {if(typeof obj[oldf] === 'function') {obj[newf]=obj[oldf]; delete obj[oldf];}}; "\
412 ppJScript p = (ppJScript)gglobal()->JScript.prv;
413 return p->runtime ? 1 : 0;
415void sm_JSDeleteScriptContext(
int num){
419 ScriptControl = getScriptControlIndex(num);
421 if (ScriptControl->eventsProcessed != NULL) {
422 JS_RemoveObjectRoot((JSContext *)ScriptControl->cx,(JSObject **)(&ScriptControl->eventsProcessed));
429 ttglobal tg = gglobal();
430 ppJScript p = (ppJScript)tg->JScript.prv;
432 JS_DestroyRuntime(p->runtime);
438static struct keyname {
442{JSGC_MAX_BYTES,
"JSGC_MAX_BYTES"},
443{JSGC_MAX_MALLOC_BYTES,
"JSGC_MAX_MALLOC_BYTES"},
444{JSGC_BYTES,
"JSGC_BYTES"},
445{JSGC_NUMBER,
"JSGC_NUMBER"},
446{JSGC_MAX_CODE_CACHE_BYTES,
"JSGC_MAX_CODE_CACHE_BYTES"},
447{JSGC_MODE,
"JSGC_MODE"},
448{JSGC_UNUSED_CHUNKS,
"JSGC_UNUSED_CHUNKS"},
449{JSGC_TOTAL_CHUNKS,
"JSGC_TOTAL_CHUNKS"},
450{JSGC_SLICE_TIME_BUDGET,
"JSGC_SLICE_TIME_BUDGET"},
451{JSGC_MARK_STACK_LIMIT,
"JSGC_MARK_STACK_LIMIT"},
452{JSGC_HIGH_FREQUENCY_TIME_LIMIT,
"JSGC_HIGH_FREQUENCY_TIME_LIMIT"},
453{JSGC_HIGH_FREQUENCY_LOW_LIMIT,
"JSGC_HIGH_FREQUENCY_LOW_LIMIT"},
454{JSGC_HIGH_FREQUENCY_HIGH_LIMIT,
"JSGC_HIGH_FREQUENCY_HIGH_LIMIT"},
455{JSGC_HIGH_FREQUENCY_HEAP_GROWTH_MAX,
"JSGC_HIGH_FREQUENCY_HEAP_GROWTH_MAX"},
456{JSGC_HIGH_FREQUENCY_HEAP_GROWTH_MIN,
"JSGC_HIGH_FREQUENCY_HEAP_GROWTH_MIN"},
457{JSGC_LOW_FREQUENCY_HEAP_GROWTH,
"JSGC_LOW_FREQUENCY_HEAP_GROWTH"},
458{JSGC_DYNAMIC_HEAP_GROWTH,
"JSGC_DYNAMIC_HEAP_GROWTH"},
459{JSGC_DYNAMIC_MARK_SLICE,
"JSGC_DYNAMIC_MARK_SLICE"},
460{JSGC_ANALYSIS_PURGE_TRIGGER,
"JSGC_ANALYSIS_PURGE_TRIGGER"},
464const char *getgcparamname(
int key){
466 while(gcparamname[i].name != NULL){
467 if(gcparamname[i].
key ==
key){
468 return gcparamname[i].name;
492void sm_JSCreateScriptContext(
int num) {
495 JSObject *_globalObj;
497 ppJScript p = (ppJScript)gglobal()->JScript.prv;
500 ScriptControl = getScriptControlIndex(num);
502 if (p->runtime == NULL) {
505 p->runtime = JS_NewRuntime(MAX_RUNTIME_BYTES, JS_NO_HELPER_THREADS);
507 p->runtime = JS_NewRuntime(MAX_RUNTIME_BYTES);
509 if (!p->runtime) freewrlDie(
"JS_NewRuntime failed");
515 JS_SetGCCallback(p->runtime, My_JSGCCallback);
522 const char* strversion = JS_GetImplementationVersion();
523 const char* substr = strstr(strversion,
"-C");
526 sscanf_s(substr,
"%d.%d.%d", &i1, &i2, &i3);
527 printf(
"javascript engine spidermonkey %s %s\n", substr, SM_method() == 2 ?
"SM2" :
"SM1");
532 _context = JS_NewContext(p->runtime, STACK_CHUNK_SIZE);
533 if (!_context) freewrlDie(
"JS_NewContext failed");
537 JSContext *cx = _context;
538 JS_SetContextPrivate(cx, ScriptControl->script->ShaderScriptNode->_executionContext);
546 JSAutoRequest ar(cx);
549 JS::RootedObject global(cx, JS_NewGlobalObject(cx, &p->globalClass,
nullptr));
553 JS::RootedValue rval(cx);
556 JSAutoCompartment ac(cx, global);
557 JS_InitStandardClasses(cx, global);
565 br = (BrowserNative *) malloc(
sizeof(BrowserNative));
568 ScriptControl->cx = _context;
569 ScriptControl->glob = _globalObj;
575 JS_SetSecondContextPrivate(_context, ScriptControl->script);
584 if (!loadVrmlClasses(_context, _globalObj)){
585 freewrlDie(
"loadVrmlClasses failed");
592 if (!loadAuxiliaryClasses(_context, _globalObj)) {
593 freewrlDie(
"loadAuxiliaryClasses failed");
595 FW_MaybeGC(
"5b", cx);
597 if (!VrmlBrowserInit(_context, _globalObj, br)){
598 freewrlDie(
"VrmlBrowserInit failed");
606 if (!ActualrunScript(num,DefaultScriptMethods,rval.address()))
607 cleanupDie(num,
"runScript failed in VRML::newJS DefaultScriptMethods");
616 const char *script =
"'hello'+'world, it is '+new Date()";
617 const char *filename =
"noname";
619 bool ok = JS_EvaluateScript(cx, global, script, strlen(script), filename, lineno, rval.address());
622 JSString *str = rval.toString();
623 printf(
"%s\n", JS_EncodeString(cx, str));
630 CRoutes_js_new (num, JAVASCRIPT);
636 return getJsEngineVariant() == 2? 2 : 0;
642int ActualrunScript(
int num,
char *script, jsval *rval) {
648 ttglobal tg = gglobal();
649 ppJScript p = (ppJScript)tg->JScript.prv;
651 ScriptControl = getScriptControlIndex(num);
653 cx = (JSContext*)ScriptControl->cx;
654 global = (JSObject*)ScriptControl->glob;
656 len = (int) strlen(script);
660 JSAutoRequest ar(cx);
663 JSAutoCompartment ac(cx, global);
664 bool ok = JS_EvaluateScript(cx, global, script, len, FNAME_STUB, LINENO_STUB, rval);
666 printf (
"ActualrunScript - JS_EvaluateScript failed for %s", script);
668 ConsoleMessage (
"ActualrunScript - JS_EvaluateScript failed for %s", script);
686int jsrrunScript(JSContext *cx, JSObject *global,
char *script, jsval *rval) {
688 ttglobal tg = gglobal();
689 ppJScript p = (ppJScript)tg->JScript.prv;
691 #ifdef JAVASCRIPTVERBOSE
692 printf(
"jsrrunScript script cx %p \"%s\", \n",
695 len = (int) strlen(script);
698 JSAutoRequest ar(cx);
701 JSAutoCompartment ac(cx, global);
702 if (!JS_EvaluateScript(cx, global, script, len,
703 FNAME_STUB, LINENO_STUB, rval)) {
704 ConsoleMessage (
"jsrunScript - JS_EvaluateScript failed for %s", script);
716int sm_jsActualrunScript(
int num,
char *script) {
718 return ACTUALRUNSCRIPT(num,script,&rval);
726int sizeofSForMF(
int itype);
727void *AnyNativeNew(
int type,
union anyVrml* source,
int *valueChanged){
729 ptr = MALLOC(AnyNative *,
sizeof(AnyNative));
730 memset(ptr,0,
sizeof(AnyNative));
732 ptr->valueChanged = valueChanged;
736 ptr->v = (
union anyVrml *)MALLOC(
void *,sizeofSForMF(type));
737 memset(ptr->v,0,sizeofSForMF(type));
742void shallow_copy_field(
int typeIndex,
union anyVrml* source,
union anyVrml* dest);
743void AnyNativeAssign(
void *top,
void *fromp)
746 AnyNative *to = (AnyNative *)top;
747 AnyNative *from = (AnyNative *)fromp;
749 (*to->valueChanged) ++;
752 if (to->type == from->type) {
753 shallow_copy_field(from->type,from->v,to->v);
756 shallow_copy_field_precision(from->type, to->type, from->v, to->v);
761void *SFNodeNativeNew()
764 ptr = MALLOC(SFNodeNative *,
sizeof(*ptr));
769 ptr->valueChanged = 0;
770 if(SM_method() == 0){
771 ptr->X3DString = NULL;
772 ptr->fieldsExpanded = FALSE;
778int SFNodeNativeAssign(
void *top,
void *fromp)
780 SFNodeNative *to = (SFNodeNative *)top;
781 SFNodeNative *from = (SFNodeNative *)fromp;
787 to->handle = from->handle;
789 to->X3DString = STRDUP(from->X3DString);
791 #ifdef JAVASCRIPTVERBOSE
792 printf (
"SFNodeNativeAssign, copied %p to %p, handle %p, string %s\n", from, to, to->handle, to->X3DString);
797 to->X3DString = STRDUP(
"from a NULL assignment");
803int SFNodeNativeEquals(
void *top,
void *fromp)
806 SFNodeNative *to = (SFNodeNative *)top;
807 SFNodeNative *from = (SFNodeNative *)fromp;
812 if(to->handle == from->handle)
819void *SFColorRGBANativeNew()
821 SFColorRGBANative *ptr;
822 ptr = MALLOC(SFColorRGBANative *,
sizeof(*ptr));
823 ptr->valueChanged = 0;
827void SFColorRGBANativeAssign(
void *top,
void *fromp)
829 SFColorRGBANative *to = (SFColorRGBANative *)top;
830 SFColorRGBANative *from = (SFColorRGBANative *)fromp;
835void *SFColorNativeNew()
838 ptr = MALLOC(SFColorNative *,
sizeof(*ptr));
839 ptr->valueChanged = 0;
843void SFColorNativeAssign(
void *top,
void *fromp)
845 SFColorNative *to = (SFColorNative *)top;
846 SFColorNative *from = (SFColorNative *)fromp;
851void *SFImageNativeNew()
854 ptr =MALLOC(SFImageNative *,
sizeof(*ptr));
855 ptr->valueChanged = 0;
859void SFImageNativeAssign(
void *top,
void *fromp)
861 SFImageNative *to = (SFImageNative *)top;
869void *SFRotationNativeNew()
871 SFRotationNative *ptr;
872 ptr = MALLOC(SFRotationNative *,
sizeof(*ptr));
873 ptr->valueChanged = 0;
877void SFRotationNativeAssign(
void *top,
void *fromp)
879 SFRotationNative *to = (SFRotationNative *)top;
880 SFRotationNative *from = (SFRotationNative *)fromp;
885void *SFVec2fNativeNew()
888 ptr = MALLOC(SFVec2fNative *,
sizeof(*ptr));
889 ptr->valueChanged = 0;
893void SFVec2fNativeAssign(
void *top,
void *fromp)
895 SFVec2fNative *to = (SFVec2fNative *)top;
896 SFVec2fNative *from = (SFVec2fNative *)fromp;
902void *SFVec3fNativeNew() {
904 ptr = MALLOC(SFVec3fNative *,
sizeof(*ptr));
905 ptr->valueChanged = 0;
909void SFVec3fNativeAssign(
void *top,
void *fromp) {
910 SFVec3fNative *to = (SFVec3fNative *)top;
911 SFVec3fNative *from = (SFVec3fNative *)fromp;
916void* SFVec2dNativeNew()
919 ptr = MALLOC(SFVec2dNative*,
sizeof(*ptr));
920 ptr->valueChanged = 0;
924void SFVec2dNativeAssign(
void* top,
void* fromp)
926 SFVec2dNative* to = (SFVec2dNative*)top;
927 SFVec2dNative* from = (SFVec2dNative*)fromp;
933void *SFVec3dNativeNew() {
935 ptr = MALLOC(SFVec3dNative *,
sizeof(*ptr));
936 ptr->valueChanged = 0;
940void SFVec3dNativeAssign(
void *top,
void *fromp) {
941 SFVec3dNative *to = (SFVec3dNative *)top;
942 SFVec3dNative *from = (SFVec3dNative *)fromp;
947void *SFVec4fNativeNew() {
949 ptr = MALLOC(SFVec4fNative *,
sizeof(*ptr));
950 ptr->valueChanged = 0;
954void SFVec4fNativeAssign(
void *top,
void *fromp) {
955 SFVec4fNative *to = (SFVec4fNative *)top;
956 SFVec4fNative *from = (SFVec4fNative *)fromp;
961void *SFVec4dNativeNew() {
963 ptr = MALLOC(SFVec4dNative *,
sizeof(*ptr));
964 ptr->valueChanged = 0;
968void SFVec4dNativeAssign(
void *top,
void *fromp) {
969 SFVec4dNative *to = (SFVec4dNative *)top;
970 SFVec4dNative *from = (SFVec4dNative *)fromp;
978static char* re_strcat(
char *_Dest,
const char *_Source,
int *destLen,
int *destDim)
999 int srclen = (int) strlen(_Source);
1000 *destLen = *destLen + srclen;
1001 if(*destLen > *destDim -1)
1003 *destDim = *destDim + srclen + 1 + 100;
1004 _Dest = (
char *)REALLOC(_Dest,*destDim);
1006 _Dest = strcat(_Dest,_Source);
1019void InitScriptField(
int num, indexT kind, indexT type,
const char* field,
union anyVrml value) {
1021 char *smallfield = NULL;
1022 char mynewname[400];
1025 char *sftype = NULL;
1029 int rowCount, eleCount;
1038 float defaultFloat[] = {0.0f,0.0f,0.0f,0.0f};
1039 int defaultInt[] = {0,0,0,0};
1040 double defaultDouble[] = {0.0, 0.0, 0.0, 0.0};
1042 struct X3D_Node *defaultVoid[] = {NULL,NULL};
1045 #ifdef JAVASCRIPTVERBOSE
1046 printf (
"calling InitScriptField from thread %u\n",pthread_self());
1047 printf (
"\nInitScriptField, num %d, kind %s type %s field %s value %d\n", num,PROTOKEYWORDS[kind],FIELDTYPES[type],field,value);
1050 if ((kind != PKW_inputOnly) && (kind != PKW_outputOnly) && (kind != PKW_initializeOnly) && (kind != PKW_inputOutput)) {
1051 ConsoleMessage (
"InitScriptField: invalid kind for script: %d\n",kind);
1055 if (type >= FIELDTYPES_COUNT) {
1056 ConsoleMessage (
"InitScriptField: invalid type for script: %d\n",type);
1059 ScriptControl = getScriptControlIndex(num);
1066 if (kind == PKW_inputOutput) {
1072 cx = (JSContext*)ScriptControl->cx;
1073 obj = (JSObject*)ScriptControl->glob;
1075 if (JS_GetProperty(cx,obj,field,&retval)){
1077 if(retval.isObject()){
1079 char runstring[STRING_SIZE];
1081 sprintf(runstring,
"_rename_function(this,'%s','set_%s');",field,field);
1085 JSAutoRequest ar(cx);
1088 JSAutoCompartment ac(cx, obj);
1089 if(!JS_EvaluateScript(cx,obj, runstring, (
int) strlen(runstring), FNAME_STUB, LINENO_STUB, &retval)){
1090 printf(
"sorry couldn't rename function: %s",runstring);
1096 strcpy(mynewname,field);
1098 }
else strcpy(mynewname,field);
1103 case FIELDTYPE_SFBool:
1104 case FIELDTYPE_SFFloat:
1105 case FIELDTYPE_SFTime:
1106 case FIELDTYPE_SFDouble:
1107 case FIELDTYPE_SFInt32:
1108 case FIELDTYPE_SFString: {
1110 if (kind != PKW_inputOnly) {
1111 JSaddGlobalECMANativeProperty(num, field);
1112 if (kind == PKW_initializeOnly || kind == PKW_inputOutput) {
1113 if (type == FIELDTYPE_SFString) {
1114 tlen = (int) strlen(value.sfstring->strptr) + strlen(field) + 20;
1116 tlen = (int) strlen(field) + 400;
1118 smallfield = MALLOC (
char *, tlen);
1119 smallfield[0] =
'\0';
1122 case FIELDTYPE_SFFloat: sprintf (smallfield,
"%s=%f\n",field,value.sffloat);
break;
1123 case FIELDTYPE_SFTime: sprintf (smallfield,
"%s=%f\n",field,value.sftime);
break;
1124 case FIELDTYPE_SFDouble: sprintf (smallfield,
"%s=%f\n",field,value.sftime);
break;
1125 case FIELDTYPE_SFInt32: sprintf (smallfield,
"%s=%d\n",field,value.sfint32);
break;
1126 case FIELDTYPE_SFBool:
1127 if (value.sfbool == 1) sprintf (smallfield,
"%s=true",field);
1128 else sprintf (smallfield,
"%s=false",field);
1130 case FIELDTYPE_SFString:
1131 sprintf (smallfield,
"%s=\"%s\"\n",field,value.sfstring->strptr);
break;
1134 if (!ACTUALRUNSCRIPT(num,smallfield,&rval))
1135 printf (
"huh??? Field initialization script failed %s\n",smallfield);
1147 case FIELDTYPE_MFString:
1148 case FIELDTYPE_MFTime:
1149 case FIELDTYPE_MFBool:
1150 case FIELDTYPE_MFInt32:
1151 case FIELDTYPE_MFFloat:
1152 JSaddGlobalECMANativeProperty(num, field);
1153 MFhasECMAtype = TRUE;
1156 MFhasECMAtype = FALSE;
1166 if (kind == PKW_initializeOnly || kind == PKW_inputOutput) {
1171 case FIELDTYPE_SFNode:
1172 VoidPtr = (
struct X3D_Node **) (&(value.sfnode)); elements = 1;
1174 case FIELDTYPE_MFColor:
1175 FloatPtr = (
float *) value.mfcolor.p; elements = value.mfcolor.n;
1177 case FIELDTYPE_MFColorRGBA:
1178 FloatPtr = (
float *) value.mfcolorrgba.p; elements = value.mfcolorrgba.n;
1180 case FIELDTYPE_MFVec2f:
1181 FloatPtr = (
float *) value.mfvec2f.p; elements = value.mfvec2f.n;
1183 case FIELDTYPE_MFVec3f:
1184 FloatPtr = (
float *) value.mfvec3f.p; elements = value.mfvec3f.n;
1186 case FIELDTYPE_MFRotation:
1187 FloatPtr = (
float *) value.mfrotation.p; elements = value.mfrotation.n;
1189 case FIELDTYPE_SFVec2f:
1190 FloatPtr = (
float *) value.sfvec2f.c; elements = 1;
1192 case FIELDTYPE_SFColor:
1193 FloatPtr = value.sfcolor.c; elements = 1;
1195 case FIELDTYPE_SFColorRGBA:
1196 FloatPtr = value.sfcolorrgba.c; elements = 1;
1198 case FIELDTYPE_SFRotation:
1199 FloatPtr = value.sfrotation.c; elements = 1;
1201 case FIELDTYPE_SFVec3f:
1202 FloatPtr = value.sfvec3f.c; elements =1;
1204 case FIELDTYPE_SFVec3d:
1205 DoublePtr = value.sfvec3d.c; elements =1;
1207 case FIELDTYPE_MFString:
1208 SVPtr = value.mfstring.p; elements = value.mfstring.n;
1210 case FIELDTYPE_MFTime:
1211 DoublePtr = value.mftime.p; elements = value.mftime.n;
1213 case FIELDTYPE_MFBool:
1214 IntPtr = value.mfbool.p; elements = value.mfbool.n;
1216 case FIELDTYPE_SFImage:
1217 case FIELDTYPE_MFInt32:
1218 IntPtr = value.mfint32.p; elements = value.mfint32.n;
1220 case FIELDTYPE_MFNode:
1221 VoidPtr = (
struct X3D_Node **)(value.mfnode.p); elements = value.mfnode.n;
1223 case FIELDTYPE_MFFloat:
1224 FloatPtr = value.mffloat.p; elements = value.mffloat.n;
1226 case FIELDTYPE_SFVec4f:
1227 FloatPtr = value.sfvec4f.c; elements = 1;
1229 case FIELDTYPE_SFVec4d:
1230 DoublePtr = value.sfvec4d.c; elements = 1;
1234 printf (
"unhandled type, in InitScriptField %d\n",type);
1244 case FIELDTYPE_SFNode:
1245 case FIELDTYPE_MFNode:
1246 VoidPtr = (
struct X3D_Node **) &defaultVoid;
1250 case FIELDTYPE_MFColor:
1251 case FIELDTYPE_MFColorRGBA:
1252 case FIELDTYPE_MFVec2f:
1253 case FIELDTYPE_MFVec3f:
1254 case FIELDTYPE_MFRotation:
1255 case FIELDTYPE_SFVec2f:
1256 case FIELDTYPE_SFColor:
1257 case FIELDTYPE_SFColorRGBA:
1258 case FIELDTYPE_SFRotation:
1259 case FIELDTYPE_SFVec3f:
1260 case FIELDTYPE_SFVec4f:
1261 case FIELDTYPE_MFFloat:
1262 FloatPtr = defaultFloat;
1266 case FIELDTYPE_MFBool:
1267 case FIELDTYPE_MFInt32:
1268 IntPtr = defaultInt;
1272 case FIELDTYPE_SFString:
1273 case FIELDTYPE_MFString:
1274 sptr[0] = newASCIIString(
"");
1279 case FIELDTYPE_SFImage:
1280 IntPtr = defaultInt;
1284 case FIELDTYPE_SFVec2d:
1285 case FIELDTYPE_SFVec3d:
1286 case FIELDTYPE_SFVec4d:
1287 case FIELDTYPE_MFTime:
1288 case FIELDTYPE_SFTime:
1289 case FIELDTYPE_SFDouble:
1290 DoublePtr = defaultDouble;
1294 printf (
"unhandled type, in InitScriptField part 2 %d\n",type);
1301 rows = returnElementRowSize (type);
1303 #ifdef JAVASCRIPTVERBOSE
1304 printf (
"in fieldSet, we have ElementRowSize %d and individual elements %d\n",rows,elements);
1331 int dstlen, dstdim, tdim;
1333 thisValue = MALLOC(
char *, tdim+1);
1334 dstdim = (rows+1)*(elements*15) + 100;
1336 smallfield = MALLOC (
char *, dstdim+1);
1338 if (type != convertToSFType(type)) haveMulti = TRUE;
1339 else haveMulti = FALSE;
1342 sftype = STRDUP((
char *)FIELDTYPES[convertToSFType(type)]);
1345 if (strncmp(sftype,
"SFString",8)==0) strcpy (sftype,
"String");
1349 smallfield[0] =
'\0';
1353 smallfield = re_strcat(smallfield,
"new ",&dstlen,&dstdim);
1354 smallfield = re_strcat(smallfield, (
char *)FIELDTYPES[type],&dstlen,&dstdim);
1355 smallfield = re_strcat(smallfield,
"(",&dstlen,&dstdim);
1359 for (eleCount=0; eleCount<elements; eleCount++) {
1361 if (!MFhasECMAtype) {
1362 smallfield = re_strcat(smallfield,
"new ",&dstlen,&dstdim);
1363 smallfield = re_strcat(smallfield, sftype,&dstlen,&dstdim);
1364 smallfield = re_strcat(smallfield,
"(",&dstlen,&dstdim);
1368 for (rowCount=0; rowCount<rows; rowCount++ ) {
1369 if (IntPtr != NULL) {
1370 sprintf (thisValue,
"%d",*IntPtr); IntPtr++;
1371 }
else if (FloatPtr != NULL) {
1372 sprintf (thisValue,
"%f",*FloatPtr); FloatPtr++;
1373 }
else if (DoublePtr != NULL) {
1374 sprintf (thisValue,
"%f",*DoublePtr); DoublePtr++;
1375 }
else if (SVPtr != NULL) {
1376 sptr[0] = *SVPtr; SVPtr++;
1377 if((
int)strlen(sptr[0]->strptr)+2 > tdim-1)
1379 tdim = (int) strlen(sptr[0]->strptr) + 1 + 100;
1380 thisValue = (
char *)REALLOC(thisValue,tdim);
1382 sprintf (thisValue,
"\"%s\"",sptr[0]->strptr);
1386 sprintf (thisValue,
"\"%p\"", VoidPtr[0]); VoidPtr++;
1388 smallfield = re_strcat(smallfield, thisValue,&dstlen,&dstdim);
1389 if (rowCount < (rows-1)) smallfield = re_strcat(smallfield,
",",&dstlen,&dstdim);
1392 if (!MFhasECMAtype) smallfield = re_strcat(smallfield,
")",&dstlen,&dstdim);
1393 if (eleCount < (elements-1)) smallfield = re_strcat(smallfield,
",",&dstlen,&dstdim);
1399 smallfield = re_strcat(smallfield,
")",&dstlen,&dstdim);
1402 FREE_IF_NZ (thisValue);
1405 #ifdef JAVASCRIPTVERBOSE
1406 printf (
"JScript, for non-ECMA newname %s, sending :%s:\n",mynewname,smallfield);
1409 JSaddGlobalAssignProperty (num,mynewname,smallfield);
1416 if (kind == PKW_outputOnly) {
1423 fptr = JSparamIndex (field, FIELDTYPES[type],kind);
1426 touched = get_valueChanged_flag (fptr, num);
1429 resetScriptTouchedFlag(num, fptr);
1431 ScriptControl = getScriptControlIndex(num);
1432 js_cleanup_script_context(num);
1434 FREE_IF_NZ (smallfield);
1435 FREE_IF_NZ (sftype);
1439void InitScriptFieldB(
int num, indexT kind, indexT type,
const char* field,
union anyVrml value) {
1444 #ifdef JAVASCRIPTVERBOSE
1445 printf (
"calling InitScriptField from thread %u\n",pthread_self());
1446 printf (
"\nInitScriptField, num %d, kind %s type %s field %s value %d\n", num,PROTOKEYWORDS[kind],FIELDTYPES[type],field,value);
1449 if ((kind != PKW_inputOnly) && (kind != PKW_outputOnly) && (kind != PKW_initializeOnly) && (kind != PKW_inputOutput)) {
1450 ConsoleMessage (
"InitScriptField: invalid kind for script: %d\n",kind);
1454 ScriptControl = getScriptControlIndex(num);
1464 if( kind == PKW_inputOutput) {
1468 cx = (JSContext*)ScriptControl->cx;
1469 obj = (JSObject*)ScriptControl->glob;
1471 if (JS_GetProperty(cx,obj,field,&retval)){
1473 if(retval.isObject()){
1475 char runstring[STRING_SIZE];
1477 sprintf(runstring,
"_rename_function(this,'%s','set_%s');",field,field);
1481 JSAutoRequest ar(cx);
1484 JSAutoCompartment ac(cx, obj);
1485 if(!JS_EvaluateScript(cx,obj, runstring, (
int) strlen(runstring), FNAME_STUB, LINENO_STUB, &retval)){
1486 printf(
"sorry couldn't rename function: %s",runstring);
1497 JSaddGlobalECMANativeProperty(num, field);
1502static int JSaddGlobalECMANativeProperty(
int num,
const char *name) {
1505 jsval rval = INT_TO_JSVAL(0);
1508 ScriptControl = getScriptControlIndex(num);
1510 cx = (JSContext*)ScriptControl->cx;
1511 global = (JSObject*)ScriptControl->glob;
1521 JSAutoRequest ar(cx);
1524 JSAutoCompartment ac(cx, global);
1525 bool ok = JS_DefineProperty(cx,global, name, rval, getECMANative, setECMANative,0);
1527 printf(
"JS_DefineProperty failed for \"%s\" in addGlobalECMANativeProperty.\n", name);
1535static int JSaddGlobalAssignProperty(
int num,
const char *name,
const char *str) {
1536 jsval _rval = INT_TO_JSVAL(0);
1541 ScriptControl = getScriptControlIndex(num);
1544 cx = (JSContext*)ScriptControl->cx;
1545 global = (JSObject*)ScriptControl->glob;
1549 JSAutoRequest ar(cx);
1552 JSAutoCompartment ac(cx,global);
1553 if (!JS_EvaluateScript(cx,global, str, (
int) strlen(str), FNAME_STUB, LINENO_STUB, &_rval)) {
1554 ConsoleMessage (
"JSaddGlobalAssignProperty - JS_EvaluateScript failed for %s", str);
1557 if (!JS_DefineProperty(cx,global, name, _rval, getAssignProperty, setAssignProperty, 0 | JSPROP_PERMANENT)) {
1558 printf(
"JS_DefineProperty failed for \"%s\" in addGlobalAssignProperty.\n", name);
1570#define GETJSPTR_TYPE_A(thistype) \
1571 case FIELDTYPE_##thistype: { \
1572 thistype##Native *ptr; \
1574 if ((ptr = (thistype##Native *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(*(jsval *)(tg->JScript.JSglobal_return_val)))) == NULL) { \
1575 printf( "JS_GetPrivate failed in get_valueChanged_flag\n"); \
1579 tg->CRoutes.JSSFpointer = (void *)ptr; \
1580 touched = ptr->valueChanged; \
1584#define RESET_TOUCHED_TYPE_A(thistype) \
1585 case FIELDTYPE_##thistype: { \
1586 ((thistype##Native *)tg->CRoutes.JSSFpointer)->valueChanged = 0; \
1590#define GETJSPTR_TYPE_MF_A(thisMFtype,thisSFtype) \
1591 case FIELDTYPE_##thisMFtype: { \
1592 thisSFtype##Native *ptr; \
1593 jsval mainElement; \
1596 if (!JS_GetProperty(cx, JSVAL_TO_OBJECT(*(jsval *)(tg->JScript.JSglobal_return_val)), "length", &mainElement)) { \
1597 printf ("JS_GetProperty failed for \"length\" in get_valueChanged_flag\n"); \
1600 len = JSVAL_TO_INT(mainElement); \
1602 for (i = 0; i < len; i++) { \
1603 if (!JS_GetElement(cx, JSVAL_TO_OBJECT(*(jsval*)(tg->JScript.JSglobal_return_val)), i, &mainElement)) { \
1604 printf ("JS_GetElement failed for %d in get_valueChanged_flag\n",i); \
1607 if ((ptr = (thisSFtype##Native *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) { \
1608 printf( "JS_GetPrivate failed for obj in setField_javascriptEventOut.\n"); \
1611 if (ptr->valueChanged > 0) touched = TRUE; \
1617#define RESET_TOUCHED_TYPE_MF_A(thisMFtype,thisSFtype) \
1618 case FIELDTYPE_##thisMFtype: { \
1619 thisSFtype##Native *ptr; \
1620 jsval mainElement; \
1624 cx = (JSContext*)scriptcontrol->cx; \
1625 if (!JS_GetProperty(cx, JSVAL_TO_OBJECT(*(jsval*)(tg->JScript.JSglobal_return_val)), "length", &mainElement)) { \
1626 printf ("JS_GetProperty failed for \"length\" in get_valueChanged_flag\n"); \
1629 len = JSVAL_TO_INT(mainElement); \
1631 for (i = 0; i < len; i++) { \
1632 if (!JS_GetElement(cx, JSVAL_TO_OBJECT(*(jsval*)(tg->JScript.JSglobal_return_val)), i, &mainElement)) { \
1633 printf ("JS_GetElement failed for %d in get_valueChanged_flag\n",i); \
1636 if ((ptr = (thisSFtype##Native *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) { \
1637 printf( "JS_GetPrivate failed for obj in setField_javascriptEventOut.\n"); \
1640 ptr->valueChanged = 0; \
1647#define GET_ECMA_TOUCHED(thistype) \
1648 case FIELDTYPE_SF##thistype: {\
1649 touched = findNameInECMATable( (JSContext*)scriptcontrol->cx,fullname);\
1653#define GET_ECMA_MF_TOUCHED(thistype) \
1654 case FIELDTYPE_MF##thistype: {\
1655 jsval mainElement; \
1657 if (!JS_GetProperty(cx, JSVAL_TO_OBJECT(*(jsval*)(tg->JScript.JSglobal_return_val)), "MF_ECMA_has_changed", &mainElement)) { \
1658 printf ("JS_GetProperty failed for \"MF_ECMA_HAS_changed\" in get_valueChanged_flag\n"); \
1660 touched = JSVAL_TO_INT(mainElement);\
1664#define RESET_ECMA_MF_TOUCHED(thistype) \
1665 case FIELDTYPE_##thistype: {\
1666 jsval myv = INT_TO_JSVAL(0); \
1668 if (!JS_SetProperty(cx, JSVAL_TO_OBJECT(*(jsval*)(tg->JScript.JSglobal_return_val)), "MF_ECMA_has_changed", &myv)) { \
1669 printf( "JS_SetProperty failed for \"MF_ECMA_has_changed\" in RESET_ECMA_MF_TOUCHED.\n"); \
1678#define RESET_TOUCHED_TYPE_ECMA(thistype) \
1679 case FIELDTYPE_##thistype: { \
1680 resetNameInECMATable( cx,JSparamnames[fptr].name); \
1686OLDCODE #define Bool savedBool
1738int sm1_get_valueChanged_flag (
int fptr,
int actualscript) {
1743 JSObject *interpobj;
1747 ttglobal tg = gglobal();
1752 scriptcontrol = getScriptControlIndex(actualscript);
1753 interpobj = (JSObject*)scriptcontrol->glob;
1754 cx = (JSContext*)scriptcontrol->cx;
1755 fullname = JSparamnames[fptr].name;
1759 JSAutoRequest ar(cx);
1762 JSAutoCompartment ac(cx, interpobj);
1764 if (!JS_GetProperty(cx, interpobj ,fullname,(jsval*)tg->JScript.JSglobal_return_val)) {
1765 printf (
"cant get property for %s\n",fullname);
1769 switch (JSparamnames[fptr].type) {
1771 GETJSPTR_TYPE_A(SFNode)
1783 GETJSPTR_TYPE_MF_A(MFNode,SFNode)
1784 GETJSPTR_TYPE_MF_A(MFVec2f,
SFVec2f)
1785 GETJSPTR_TYPE_MF_A(MFVec3f,
SFVec3f)
1786 GETJSPTR_TYPE_MF_A(MFVec4f,
SFVec4f)
1787 GETJSPTR_TYPE_MF_A(MFVec4d,
SFVec4d)
1789 GETJSPTR_TYPE_MF_A(MFColor,
SFColor)
1792 GET_ECMA_MF_TOUCHED(Int32)
1793 GET_ECMA_MF_TOUCHED(Bool)
1794 GET_ECMA_MF_TOUCHED(Time)
1795 GET_ECMA_MF_TOUCHED(Double)
1796 GET_ECMA_MF_TOUCHED(Float)
1797 GET_ECMA_MF_TOUCHED(String)
1799 GET_ECMA_TOUCHED(Int32)
1800 GET_ECMA_TOUCHED(Bool)
1801 GET_ECMA_TOUCHED(Float)
1802 GET_ECMA_TOUCHED(Time)
1803 GET_ECMA_TOUCHED(Double)
1804 GET_ECMA_TOUCHED(String)
1806 default: {printf (
"not handled yet in get_valueChanged_flag %s\n",FIELDTYPES[JSparamnames[fptr].type]);
1819void sm1_resetScriptTouchedFlag(
int actualscript,
int fptr) {
1822 ttglobal tg = gglobal();
1826 scriptcontrol = getScriptControlIndex(actualscript);
1827 cx = (JSContext*)scriptcontrol->cx;
1828 global = (JSObject*)scriptcontrol->glob;
1831 JSAutoRequest ar(cx);
1834 JSAutoCompartment ac(cx, global);
1836 switch (JSparamnames[fptr].type) {
1838 RESET_TOUCHED_TYPE_A(SFNode)
1848 RESET_TOUCHED_TYPE_MF_A(MFRotation,
SFRotation)
1849 RESET_TOUCHED_TYPE_MF_A(MFNode,SFNode)
1850 RESET_TOUCHED_TYPE_MF_A(MFVec2f,
SFVec2f)
1851 RESET_TOUCHED_TYPE_MF_A(MFVec3f,
SFVec3f)
1852 RESET_TOUCHED_TYPE_MF_A(MFVec4f,
SFVec4f)
1853 RESET_TOUCHED_TYPE_MF_A(MFVec4d,
SFVec4d)
1855 RESET_TOUCHED_TYPE_MF_A(MFColor,
SFColor)
1858 RESET_TOUCHED_TYPE_ECMA (SFInt32)
1859 RESET_TOUCHED_TYPE_ECMA (SFBool)
1860 RESET_TOUCHED_TYPE_ECMA (SFFloat)
1861 RESET_TOUCHED_TYPE_ECMA (SFTime)
1862 RESET_TOUCHED_TYPE_ECMA (SFDouble)
1863 RESET_TOUCHED_TYPE_ECMA (SFString)
1864 RESET_ECMA_MF_TOUCHED(MFInt32)
1865 RESET_ECMA_MF_TOUCHED(MFBool)
1866 RESET_ECMA_MF_TOUCHED(MFFloat)
1867 RESET_ECMA_MF_TOUCHED(MFTime)
1868 RESET_ECMA_MF_TOUCHED(MFString)
1869 default: {printf (
"can not reset touched_flag for %s\n",stringFieldtypeType(JSparamnames[fptr].type));}
1875int sm2_get_valueChanged_flag (
int fptr,
int actualscript){
1878 int type, kind, ifield, found;
1885 scriptcontrol = getScriptControlIndex(actualscript);
1886 script = scriptcontrol->script;
1887 node = script->ShaderScriptNode;
1888 fullname = JSparamnames[fptr].name;
1889 found = getFieldFromNodeAndName(node,fullname,&type,&kind,&ifield,&value);
1891 field = Shader_Script_getScriptField(script, ifield);
1892 gglobal()->JScript.JSglobal_return_val = (
void *)&field->value;
1893 return field->valueChanged;
1895 gglobal()->JScript.JSglobal_return_val = NULL;
1898void sm2_resetScriptTouchedFlag(
int actualscript,
int fptr){
1901 int type, kind, ifield, found;
1908 scriptcontrol = getScriptControlIndex(actualscript);
1909 script = scriptcontrol->script;
1910 node = script->ShaderScriptNode;
1911 fullname = JSparamnames[fptr].name;
1912 found = getFieldFromNodeAndName(node,fullname,&type,&kind,&ifield,&value);
1914 field = Shader_Script_getScriptField(script, ifield);
1915 field->valueChanged = 0;
1920int sm_get_valueChanged_flag (
int fptr,
int actualscript){
1921 if(SM_method() == 2)
1922 return sm2_get_valueChanged_flag(fptr,actualscript);
1924 return sm1_get_valueChanged_flag(fptr,actualscript);
1926void sm_resetScriptTouchedFlag(
int actualscript,
int fptr){
1927 if(SM_method() == 2)
1928 sm2_resetScriptTouchedFlag(actualscript,fptr);
1930 sm1_resetScriptTouchedFlag(actualscript,fptr);
1933int jsActualrunScript(
int num,
char *script);
1934void sm_JSInitializeScriptAndFields (
int num) {
1948 int i,nfields,kind,itype;
1949 const char *fieldname;
1950 char longfieldname[256];
1954 ScriptControl = getScriptControlIndex(num);
1957 if(1)
if (!jsActualrunScript(num, ScriptControl->scriptText)) {
1958 ConsoleMessage (
"JSInitializeScriptAndFields, script failure\n");
1959 ScriptControl->scriptOK = FALSE;
1960 ScriptControl->_initialized = TRUE;
1970 script = ScriptControl->script;
1972 nfields = Shader_Script_getScriptFieldCount(script);
1973 for(i=0;i<nfields;i++){
1974 field = Shader_Script_getScriptField(script,i);
1975 fieldname = ScriptFieldDecl_getName(field);
1976 kind = ScriptFieldDecl_getMode(field);
1977 itype = ScriptFieldDecl_getType(field);
1978 longfieldname[0] = 0;
1979 if(kind == PKW_inputOnly)
1980 strcat(longfieldname,
"__eventIn_Value_");
1981 strcat(longfieldname,fieldname);
1982 if(SM_method() == 2)
1983 InitScriptFieldB(num, kind, itype, longfieldname, field->value);
1985 InitScriptField(num, kind, itype, longfieldname, field->value);
1989 if(0)
if (!jsActualrunScript(num, ScriptControl->scriptText)) {
1990 ConsoleMessage (
"JSInitializeScriptAndFields, script failure\n");
1991 ScriptControl->scriptOK = FALSE;
1992 ScriptControl->_initialized = TRUE;
1997 ScriptControl->_initialized = TRUE;
1998 ScriptControl->scriptOK = TRUE;
2005void sm_SaveScriptField (
int num, indexT kind, indexT type,
const char* field,
union anyVrml value) {
2022void getJSMultiNumType (JSContext *cx,
struct Multi_Vec3f *tn,
int eletype) {
2037 SFVec2fNative *sfvec2f;
2038 SFVec3fNative *sfvec3f;
2039 SFRotationNative *sfrotation;
2042 ttglobal tg = gglobal();
2046 elesize = returnElementLength(eletype) * returnElementRowSize(eletype);
2050 #ifdef SETFIELDVERBOSE
2051 printf (
"getJSMultiNumType, JSCreate_global_return_val %u, JSglobal_return_val %u\n",
2052 (
unsigned int) JSVAL_TO_INT(*(jsval *)tg->jsVRMLBrowser.JSCreate_global_return_val),
2053 (
unsigned int) JSVAL_TO_INT(*(jsval *)tg->JScript.JSglobal_return_val));
2056 if (JSVAL_TO_INT(*(jsval*)(tg->jsVRMLBrowser.JSCreate_global_return_val)) != 0) {
2057 myJSVal = (jsval *)tg->jsVRMLBrowser.JSCreate_global_return_val;
2058 *(jsval *)(tg->jsVRMLBrowser.JSCreate_global_return_val) = INT_TO_JSVAL(0);
2060 #ifdef SETFIELDVERBOSE
2061 printf (
"getJSMultiNumType: using JSCreate_global_return_val\n");
2064 #ifdef SETFIELDVERBOSE
2065 printf (
"getJSMultiNumType: using JSglobal_return_val\n");
2068 myJSVal = (jsval *)tg->JScript.JSglobal_return_val;
2072 if(!(*myJSVal).isObject()){
2073 printf (
"getJSMultiNumType - did not get an object\n");
2077 #ifdef SETFIELDVERBOSE
2078 printf (
"getJSMultiNumType, tn %p dest has %s size %d\n",tn,stringFieldtypeType(eletype), elesize);
2080 printf(
"getJSMulitNumType, node type of myJSVal is :");
2081 printJSNodeType (cx,myJSVal);
2084 if (!JS_GetProperty(cx, JSVAL_TO_OBJECT(*myJSVal), MF_LENGTH_FIELD, &mainElement)) {
2085 printf (
"JS_GetProperty failed for \"%s\" in getJSMultiNumType\n", MF_LENGTH_FIELD);
2088 len = JSVAL_TO_INT(mainElement);
2089 #ifdef SETFIELDVERBOSE
2090 printf (
"getmuiltie length of grv is %d old len is %d\n",len,tn->n);
2100 tn->p = MALLOC (
struct SFVec3f *, (
unsigned)(elesize*len));
2102 #ifdef SETFIELDVERBOSE
2103 printf (
"MALLOCing memory for elesize %d len %d new pointer now is %p\n",elesize,len,tn->p);
2107 if (eletype == FIELDTYPE_SFString) {
2108 #ifdef SETFIELDVERBOSE
2109 printf (
"getJSMultiNumType, this is a MFString, so making tiny strings for now\n");
2113 for (i=0; i<len; i++) {
2114 *ms = newASCIIString (
"(getJSMultiNumType null)");
2121 fl = (
float *) tn->p;
2122 il = (
long *) tn->p;
2123 dl = (
double *) tn->p;
2128 for (i = 0; i < len; i++) {
2129 if (!JS_GetElement(cx, JSVAL_TO_OBJECT(*myJSVal), i, &mainElement)) {
2130 printf (
"WARNING: JS_GetElement failed for %d in getJSMultiNumType\n",i);
2132 case FIELDTYPE_SFNode:
2133 *nl = 0; nl++;
break;
2134 case FIELDTYPE_SFInt32:
2136 case FIELDTYPE_SFDouble:
2137 case FIELDTYPE_SFTime:
2138 *dl=0.0; dl++;
break;
2139 case FIELDTYPE_SFFloat:
2140 *fl = (float) 0.0; fl++;
break;
2141 case FIELDTYPE_SFVec2f:
2142 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
break;
2143 case FIELDTYPE_SFVec3f:
2144 case FIELDTYPE_SFColor:
2145 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
break;
2146 case FIELDTYPE_SFRotation:
2147 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
break;
2148 case FIELDTYPE_SFString:
2149 verify_Uni_String (*ms,
"(empty value)"); ms++;
break;
2151 default : {printf (
"getJSMultiNumType unhandled eletype: %d\n",
2157 #ifdef SETFIELDVERBOSE
2160 _tmpStr = JS_ValueToString(cx, mainElement);
2162 strp = JS_GetStringBytes(_tmpStr);
2164 strp = strpp = JS_EncodeString(cx,_tmpStr);
2166 printf (
"sub element %d is \"%s\" \n",i,strp);
2167#if JS_VERSION >= 185
2171 if (JSVAL_IS_OBJECT(mainElement)) printf (
"sub element %d is an OBJECT\n",i);
2172 if (JSVAL_IS_PRIMITIVE(mainElement)) printf (
"sub element %d is an PRIMITIVE\n",i);
2177 case FIELDTYPE_SFNode: {
2179 if (JS_InstanceOf (cx, JSVAL_TO_OBJECT(mainElement), &SFNodeClass, NULL)) {
2183 if ((_vec = (SFNodeNative *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) {
2184 printf (
"error getting native\n");
2192 printf (
"hmm - not an SFNode class\n");
2199 case FIELDTYPE_SFInt32: {
2205 if(mainElement.isInt32()) *il = mainElement.toInt32();
2209 case FIELDTYPE_SFDouble:
2210 case FIELDTYPE_SFTime: {
2211 if (!JS_ValueToNumber(cx, mainElement ,dl)) *dl=0.0;
2215 case FIELDTYPE_SFFloat: {
2216 if (!JS_ValueToNumber(cx, mainElement, &dtmp)) dtmp=0.0;
2222 case FIELDTYPE_SFVec2f: {
2224 if(mainElement.isObject()){
2225 if ((sfvec2f = (SFVec2fNative *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) {
2226 printf(
"JS_GetPrivate failed for obj in setField_javascriptEventOut.\n");
2229 memcpy ((
void *)fl, (
void *)&(sfvec2f->v),2*
sizeof(
float));
2233 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
2237 case FIELDTYPE_SFVec3f:
2238 case FIELDTYPE_SFColor: {
2240 if(mainElement.isObject()){
2241 if ((sfvec3f = (SFVec3fNative *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) {
2242 printf(
"JS_GetPrivate failed for obj in setField_javascriptEventOut.\n");
2245 memcpy ((
void *)fl, (
void *)&(sfvec3f->v),3*
sizeof(
float));
2249 *fl = (float) 0.0; fl++;
2250 *fl = (float) 0.0; fl++;
2251 *fl = (float) 0.0; fl++;
2255 case FIELDTYPE_SFRotation: {
2257 if(mainElement.isObject()){
2258 if ((sfrotation = (SFRotationNative *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) {
2259 printf(
"JS_GetPrivate failed for obj in setField_javascriptEventOut.\n");
2262 memcpy ((
void *)fl, (
void *)&(sfrotation->v),4*
sizeof(
float));
2266 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
2267 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
2272 case FIELDTYPE_SFString: {
2275 strval = JS_ValueToString(cx, mainElement);
2276 strp = strpp = JS_EncodeString(cx,strval);
2280 #ifdef SETFIELDVERBOSE
2281 printf (
"getJSMultiNumType, got string %s\n",strp);
2285 verify_Uni_String (*ms,strp);
2293 default : {printf (
"getJSMultiNumType unhandled eletype: %d\n",
2301 #ifdef SETFIELDVERBOSE
2302 printf (
"getJSMultiNumType, setting old length %d to length %d\n",tn->n, len);
2312void getMFStringtype (JSContext *cx, jsval *from,
struct Multi_String *to) {
2317 char *valStr, *OldvalStr;
2328 if (!JS_ValueToObject(cx, *from, &obj))
2329 printf (
"JS_ValueToObject failed in getMFStringtype\n");
2331 if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &_v)) {
2332 printf (
"JS_GetProperty failed for \"%s\" in getMFStringtype.\n", MF_LENGTH_FIELD);
2335 newlen = JSVAL_TO_INT(_v);
2341 if (newlen > oldlen) {
2344 to->p = MALLOC(
struct Uni_String **, newlen *
sizeof(to->p));
2348 for (count = 0; count <oldlen; count ++) {
2356 for (count = oldlen; count < newlen; count ++) {
2362 *newp = newASCIIString(
"");
2381 for (i = 0; i < newlen; i++) {
2383 OldvalStr = svptr[i]->strptr;
2387 if (!JS_GetElement(cx, obj, i, &_v)) {
2389 "JS_GetElement failed for %d in getMFStringtype\n",i);
2392 strval = JS_ValueToString(cx, _v);
2394 valStr = JS_EncodeString(cx,strval);
2400 if (strcmp(valStr,OldvalStr) != 0) {
2402 svptr[i] = newASCIIString(valStr);
2421void setField_javascriptEventOut(
struct X3D_Node *tn,
unsigned int tptr,
int fieldType,
unsigned len,
int extraData, JSContext *scriptContext) {
2429 ttglobal tg = gglobal();
2433 memptr = offsetPointer_deref(
char *, tn, tptr);
2435#define GETJSVAL_TYPE_A(thistype,field) \
2436 case FIELDTYPE_##thistype: { \
2438 memcpy ((void *)memptr, (void *) &(((thistype##Native *)tg->CRoutes.JSSFpointer)->field),len); \
2442#define GETJSVAL_TYPE_MF_A(MFtype,SFtype) \
2443 case FIELDTYPE_##MFtype: {getJSMultiNumType (scriptContext, (struct Multi_Vec3f *)memptr,FIELDTYPE_##SFtype); break;}
2445 switch (fieldType) {
2458 GETJSVAL_TYPE_MF_A(MFVec2d,
SFVec2d)
2459 GETJSVAL_TYPE_MF_A(MFVec3d,
SFVec3d)
2460 GETJSVAL_TYPE_MF_A(MFVec4d,
SFVec4d)
2461 GETJSVAL_TYPE_MF_A(MFVec2f,
SFVec2f)
2462 GETJSVAL_TYPE_MF_A(MFVec3f,
SFVec3f)
2463 GETJSVAL_TYPE_MF_A(MFVec4f,
SFVec4f)
2464 GETJSVAL_TYPE_MF_A(MFColor,
SFColor)
2468 case FIELDTYPE_SFInt32:
2469 case FIELDTYPE_SFBool: {
2471 val = *(jsval*)(tg->JScript.JSglobal_return_val);
2474 if(! (val.isBoolean() || val.isInt32())){
2477 if(val.isBoolean()) ival = val.isTrue() ? TRUE : FALSE;
2478 if(val.isInt32()) ival = val.toInt32() == 0 ? FALSE : TRUE;
2479 memcpy ((
void *)memptr, (
void *)&ival,len);
2483 case FIELDTYPE_SFDouble:
2484 case FIELDTYPE_SFTime: {
2485 if (!JS_ValueToNumber(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val),&tval)) tval=0.0;
2486 memcpy ((
void *)memptr, (
void *)&tval,len);
2490 case FIELDTYPE_SFFloat: {
2491 if (!JS_ValueToNumber(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val),&tval)) tval=0.0;
2493 fl[0] = (float) tval;
2494 memcpy ((
void *)memptr, (
void *)fl,len);
2498 case FIELDTYPE_SFImage: {
2500 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2501 strp = strpp = JS_EncodeString(scriptContext,strval);
2502 Parser_scanStringValueToMem(tn, tptr, FIELDTYPE_SFImage, strp, FALSE);
2503 JS_free(scriptContext,strpp);
2507 case FIELDTYPE_SFString: {
2511 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2512 strp = strpp = JS_EncodeString(scriptContext,strval);
2516 newptr = (intptr_t *)memptr;
2518 verify_Uni_String (ms,strp);
2519 JS_free(scriptContext,strpp);
2524 case FIELDTYPE_MFFloat: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFFloat);
break;}
2525 case FIELDTYPE_MFInt32: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFInt32);
break;}
2526 case FIELDTYPE_MFTime: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFTime);
break;}
2527 case FIELDTYPE_MFDouble: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFDouble);
break;}
2528 case FIELDTYPE_MFNode: {
2531 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2532 strp = strpp = JS_EncodeString(scriptContext,strval);
2535 while ((*strp >
'\0') && (*strp <=
' ')) strp ++;
2537 if (*strp ==
'[') strp ++;
2538 while ((*strp >
'\0') && (*strp <=
' ')) strp ++;
2542 mynode = X3D_NODE(atol(strp));
2544 mynode = X3D_NODE(atoll(strp));
2546 JS_free(scriptContext,strpp);
2553 getMFNodetype (mynode,(
struct Multi_Node *)memptr,X3D_NODE(tn),extraData);
break;
2555 case FIELDTYPE_MFString: {
2558 (jsval *)tg->JScript.JSglobal_return_val,
2563 case FIELDTYPE_SFNode: {
2567 memcpy ((
void *)memptr, (
void *) &(((SFNodeNative *)tg->CRoutes.JSSFpointer)->handle),returnElementLength(FIELDTYPE_SFNode));
2573 default: { printf(
"WARNING: unhandled from type %s\n", stringFieldtypeType(fieldType));
2580void setField_javascriptEventOut_B(
union anyVrml* any,
2581 int fieldType,
unsigned len,
int extraData, JSContext *scriptContext)
2593 ttglobal tg = gglobal();
2595 memptr = (
char *)any;
2597#define GETJSVAL_TYPE_A(thistype,field) \
2598 case FIELDTYPE_##thistype: { \
2600 memcpy ((void *)memptr, (void *) &(((thistype##Native *)tg->CRoutes.JSSFpointer)->field),len); \
2604#define GETJSVAL_TYPE_MF_A(MFtype,SFtype) \
2605 case FIELDTYPE_##MFtype: {getJSMultiNumType (scriptContext, (struct Multi_Vec3f *)memptr,FIELDTYPE_##SFtype); break;}
2607 switch (fieldType) {
2620 GETJSVAL_TYPE_MF_A(MFVec2d,
SFVec2d)
2621 GETJSVAL_TYPE_MF_A(MFVec3d,
SFVec3d)
2622 GETJSVAL_TYPE_MF_A(MFVec4d,
SFVec4d)
2623 GETJSVAL_TYPE_MF_A(MFVec2f,
SFVec2f)
2624 GETJSVAL_TYPE_MF_A(MFVec3f,
SFVec3f)
2625 GETJSVAL_TYPE_MF_A(MFVec4f,
SFVec4f)
2626 GETJSVAL_TYPE_MF_A(MFColor,
SFColor)
2630 case FIELDTYPE_SFInt32:
2631 case FIELDTYPE_SFBool: {
2633 jsval val = *(jsval*)(tg->JScript.JSglobal_return_val);
2634 if(!val.isBoolean() || val.isInt32()){
2639 if(val.isBoolean()) ival = val.isTrue() ? TRUE : FALSE;
2640 if(val.isInt32()) ival = val.toInt32() == 0 ? FALSE : TRUE;
2641 memcpy ((
void *)memptr, (
void *)&ival,len);
2645 case FIELDTYPE_SFDouble:
2646 case FIELDTYPE_SFTime: {
2647 if (!JS_ValueToNumber(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val),&tval)) tval=0.0;
2648 memcpy ((
void *)memptr, (
void *)&tval,len);
2652 case FIELDTYPE_SFFloat: {
2653 if (!JS_ValueToNumber(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val),&tval)) tval=0.0;
2655 fl[0] = (float) tval;
2656 memcpy ((
void *)memptr, (
void *)fl,len);
2660 case FIELDTYPE_SFImage: {
2662 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2663 strp = strpp = JS_EncodeString(scriptContext,strval);
2664 Parser_scanStringValueToMem_B(any, FIELDTYPE_SFImage, strp, FALSE);
2665 JS_free(scriptContext,strpp);
2669 case FIELDTYPE_SFString: {
2673 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2674 strp = strpp = JS_EncodeString(scriptContext,strval);
2679 newptr = (intptr_t *)memptr;
2683 *newptr = (intptr_t) ms;
2686 ms->touched = FALSE;
2688 verify_Uni_String (ms,strp);
2689 JS_free(scriptContext,strpp);
2695 case FIELDTYPE_MFFloat: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFFloat);
break;}
2696 case FIELDTYPE_MFInt32: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFInt32);
break;}
2697 case FIELDTYPE_MFTime: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFTime);
break;}
2698 case FIELDTYPE_MFDouble: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFDouble);
break;}
2699 case FIELDTYPE_MFNode: {
2702 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2703 strp = strpp = JS_EncodeString(scriptContext,strval);
2705 while ((*strp >
'\0') && (*strp <=
' ')) strp ++;
2707 if (*strp ==
'[') strp ++;
2708 while ((*strp >
'\0') && (*strp <=
' ')) strp ++;
2713 mynode = X3D_NODE(atol(strp));
2715 mynode = X3D_NODE(atoll(strp));
2717 JS_free(scriptContext,strpp);
2727 any->mfnode.p[0] = mynode;
2731 case FIELDTYPE_MFString: {
2734 (jsval *)tg->JScript.JSglobal_return_val,
2739 case FIELDTYPE_SFNode: {
2743 memcpy ((
void *)memptr, (
void *) &(((SFNodeNative *)tg->CRoutes.JSSFpointer)->handle),returnElementLength(FIELDTYPE_SFNode));
2749 default: { printf(
"WARNING: unhandled from type %s\n", stringFieldtypeType(fieldType));
2756void sm_js_setField_javascriptEventOut(
struct X3D_Node *tn,
unsigned int tptr,
int fieldType,
unsigned len,
int extraData,
int actualscript) {
2760 scriptcontrol = getScriptControlIndex(actualscript);
2761 cx = (JSContext*)scriptcontrol->cx;
2762 global = (JSObject*)scriptcontrol->glob;
2765 JSAutoRequest ar(cx);
2768 JSAutoCompartment ac(cx, global);
2769 setField_javascriptEventOut(tn,tptr,fieldType, len, extraData, (JSContext*)scriptcontrol->cx);
2774void sm_js_setField_javascriptEventOut_B(
union anyVrml* any,
int fieldType,
unsigned len,
int extraData,
int actualscript){
2778 scriptcontrol = getScriptControlIndex(actualscript);
2779 cx = (JSContext*)scriptcontrol->cx;
2780 global = (JSObject*)scriptcontrol->glob;
2783 JSAutoRequest ar(cx);
2786 JSAutoCompartment ac(cx, global);
2787 setField_javascriptEventOut_B(any,fieldType, len, extraData, (JSContext*)scriptcontrol->cx);
2795void sm_set_one_ECMAtype (
int tonode,
int toname,
int dataType,
void *Data,
int datalen) {
2796 char scriptline[256];
2801 ttglobal tg = gglobal();
2802 ppJScript p = (ppJScript)tg->JScript.prv;
2807 #ifdef SETFIELDVERBOSE
2808 printf (
"set_one_ECMAtype, to %d namepointer %d, fieldname %s, datatype %d length %d\n",
2809 tonode,toname,JSparamnames[toname].name,dataType,datalen);
2811 ScriptControl = getScriptControlIndex(tonode);
2813 cx = (JSContext*)ScriptControl->cx;
2814 obj = (JSObject*)ScriptControl->glob;
2819 JSAutoRequest ar(cx);
2822 JSAutoCompartment ac(cx, obj);
2828 JS_NewNumberValue(cx, TickTime(), &zimbo);
2829 if (!JS_DefineProperty(cx,obj,
"__eventInTickTime", zimbo, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB2, JSPROP_PERMANENT)) {
2830 printf(
"JS_DefineProperty failed for \"__eventInTickTime\" at %s:%d.\n",__FILE__,__LINE__);
2833 FW_MaybeGC(
"SOET TT", cx);
2841 kind = JSparamnames[toname].kind;
2842 if(SM_method() == 2){
2843 int type, iifield, *valueChanged, ifound;
2847 fieldname = JSparamnames[toname].name;
2849 ifound = getFieldFromScript(script,fieldname,&type,&kind,&iifield,&value,&valueChanged);
2850 if(ifound && type == dataType && isSFType(type)){
2854 shallow_copy_field(type,any,value);
2857 (*valueChanged) = 1;
2859 ConsoleMessage(
"sm_set_one_ECMAtype did not find field %s type %d\n",fieldname, dataType);
2864 X3D_ECMA_TO_JS(cx, Data, datalen, dataType, &newval);
2868 if(kind == PKW_inputOnly)
2869 strcat(scriptline,
"__eventIn_Value_");
2871 strcat(scriptline,JSparamnames[toname].name);
2872 #ifdef SETFIELDVERBOSE
2873 printf (
"set_one_ECMAtype, calling JS_DefineProperty on name %s obj %u, setting setECMANative, 0 \n",scriptline,obj);
2876 if (!JS_DefineProperty(cx,obj, scriptline, newval, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_PERMANENT)) {
2877 printf(
"JS_DefineProperty failed for \"ECMA in\" at %s:%d.\n",__FILE__,__LINE__);
2886 JSScript* hscript = NULL;
2887 JS::RootedScript rscript(cx,hscript);
2891 int tnfield = toname;
2892 hscript = (JSScript*)JSparamnames[tnfield].eventInFunction;
2893 if (JSparamnames[tnfield].eventInFunction == NULL || TRUE) {
2894 if(kind == PKW_inputOutput)
2895 sprintf (scriptline,
"set_%s(%s,__eventInTickTime)", JSparamnames[tnfield].name,JSparamnames[tnfield].name);
2897 sprintf (scriptline,
"%s(%s%s,__eventInTickTime)", JSparamnames[tnfield].name,
"__eventIn_Value_",JSparamnames[tnfield].name);
2899 hscript = (JSScript*)JS_CompileScript(
2900 cx, obj, scriptline, strlen(scriptline),
"compile eventIn",1);
2901 JSparamnames[tnfield].eventInFunction = (
void*)hscript;
2902 if(0)
if (!JS_AddObjectRoot(cx,(JSObject**)(&JSparamnames[tnfield].eventInFunction))) {
2903 printf(
"JS_AddObjectRoot failed for compilation of script \"%s\" at %s:%d.\n",scriptline,__FILE__,__LINE__);
2908 FW_MaybeGC(
"CF", cx);
2915 RUN_FUNCTION(toname);
2916 FW_MaybeGC(
"RF", cx);
2937void sm_setScriptECMAtype (
int num) {
2942 CRnodeStruct *to_ptr = NULL;
2943 struct CRStruct *CRoutes = getCRoutes();
2946 fn = offsetPointer_deref(
void *, CRoutes[num].routeFromNode, CRoutes[num].fnptr);
2947 len = CRoutes[num].len;
2949 for (to_counter = 0; to_counter < CRoutes[num].tonode_count; to_counter++) {
2952 to_ptr = &(CRoutes[num].tonodes[to_counter]);
2953 myObj = (
struct Shader_Script*)X3D_SCRIPT(to_ptr->routeToNode)->__scriptObj;
2955 tptr = to_ptr->foffset;
2956 set_one_ECMAtype (myObj->num, tptr, JSparamnames[tptr].type, fn,len);
2963void sm_set_one_MFElementType(
int tonode,
int toname,
int dataType,
void *Data,
int datalen) {
2968 char scriptline[20000];
2980 ttglobal tg = gglobal();
2981 ppJScript p = (ppJScript)tg->JScript.prv;
2984 ScriptControl = getScriptControlIndex(tonode);
2985 cx = (JSContext*)ScriptControl->cx;
2986 obj = (JSObject*)ScriptControl->glob;
2990 JSAutoRequest ar(cx);
2993 JSAutoCompartment ac(cx, obj);
2996 kind = JSparamnames[toname].kind;
2997 if(SM_method() == 2){
2998 int type, iifield, *valueChanged, ifound;
3002 fieldname = JSparamnames[toname].name;
3004 ifound = getFieldFromScript(script,fieldname,&type,&kind,&iifield,&value,&valueChanged);
3005 if(ifound && type == dataType && !isSFType(type)){
3008 any.mfbool.n = datalen;
3009 any.mfbool.p = (
int *)Data;
3014 shallow_copy_field(type,&any,value);
3021 (*valueChanged) = 1;
3023 ConsoleMessage(
"sm_set_one_MFElementType did not find field %s type %d\n",fieldname, dataType);
3029 FW_MaybeGC(
"TT",cx);
3034 JSScript* hscript = NULL;
3035 JS::RootedScript rscript(cx, hscript);
3038 int tnfield = toname;
3040 if (JSparamnames[tnfield].eventInFunction == NULL || TRUE) {
3041 if(kind == PKW_inputOutput)
3042 sprintf (scriptline,
"set_%s(%s,__eventInTickTime)", JSparamnames[tnfield].name,JSparamnames[tnfield].name);
3044 sprintf (scriptline,
"%s(%s%s,__eventInTickTime)", JSparamnames[tnfield].name,
"__eventIn_Value_",JSparamnames[tnfield].name);
3047 hscript = JS_CompileScript( cx, obj, scriptline, strlen(scriptline),
"compile eventIn",1);
3048 JSparamnames[tnfield].eventInFunction = (
void*)hscript;
3053 if(0)
if (!JS_AddObjectRoot(cx,(JSObject**)(&JSparamnames[tnfield].eventInFunction))) {
3054 printf(
"JS_AddObjectRoot failed for compilation of script \"%s\" at %s:%d.\n",scriptline,__FILE__,__LINE__);
3060 FW_MaybeGC(
"CF", cx);
3066 RUN_FUNCTION(toname);
3080 FW_MaybeGC(
"RF", cx);
3090 case FIELDTYPE_MFRotation: {
3091 JSObject *newMFObject;
3092 JSObject *newSFObject;
3093 SFRotationNative *SFRPptr;
3094 float *fp, *fp_in=(
float *)Data;
3097 newMFObject = JS_ConstructObjectFw(cx, &MFRotationClass, NULL ,JS_GetParentFw(cx, obj));
3098 ADD_ROOT (cx, newMFObject)
3101 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3104 elementlen = (int)
sizeof (
float);
3105 for (x=0; x<datalen; x++) {
3107 newSFObject = JS_ConstructObjectFw(cx,&SFRotationClass,NULL, newMFObject);
3108 if ((SFRPptr = (SFRotationNative *)JS_GetPrivateFw(cx, newSFObject)) == NULL) {
3109 ConsoleMessage (
"failure in getting SF class at %s:%d\n",__FILE__,__LINE__);
3114 fp = (
float *)fp_in; SFRPptr->v.c[0] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3115 fp = (
float *)fp_in; SFRPptr->v.c[1] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3116 fp = (
float *)fp_in; SFRPptr->v.c[2] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3117 fp = (
float *)fp_in; SFRPptr->v.c[3] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3120 if (!JS_DefineElement(cx, newMFObject, (jsint) x, OBJECT_TO_JSVAL(newSFObject),
3121 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3122 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3127 SET_LENGTH (cx,newMFObject,datalen)
3130 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3133 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3134 RUN_FUNCTION(toname)
3138 case FIELDTYPE_MFVec3f: {
3139 JSObject *newMFObject;
3140 JSObject *newSFObject;
3141 SFVec3fNative *SFRPptr;
3142 float *fp, *fp_in=(
float *)Data;
3145 newMFObject = JS_ConstructObjectFw(cx, &MFVec3fClass, NULL ,JS_GetParentFw(cx, obj));
3146 ADD_ROOT (cx, newMFObject)
3149 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3152 elementlen = (int)
sizeof (
float);
3153 for (x=0; x<datalen; x++) {
3155 newSFObject = JS_ConstructObjectFw(cx,&SFVec3fClass,NULL, newMFObject);
3156 if ((SFRPptr = (SFVec3fNative *)JS_GetPrivateFw(cx, newSFObject)) == NULL) {
3157 ConsoleMessage (
"failure in getting SF class at %s:%d\n",__FILE__,__LINE__);
3162 fp = (
float *)fp_in; SFRPptr->v.c[0] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3163 fp = (
float *)fp_in; SFRPptr->v.c[1] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3164 fp = (
float *)fp_in; SFRPptr->v.c[2] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3167 if (!JS_DefineElement(cx, newMFObject, (jsint) x, OBJECT_TO_JSVAL(newSFObject),
3168 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3169 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3174 SET_LENGTH (cx,newMFObject,datalen)
3177 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3180 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3181 RUN_FUNCTION(toname)
3185 case FIELDTYPE_MFColor: {
3186 JSObject *newMFObject;
3187 JSObject *newSFObject;
3188 SFColorNative *SFRPptr;
3189 float *fp, *fp_in=(
float *)Data;
3192 newMFObject = JS_ConstructObjectFw(cx, &MFColorClass, NULL ,JS_GetParentFw(cx, obj));
3193 ADD_ROOT (cx, newMFObject)
3196 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3199 elementlen = (int)
sizeof (
float);
3200 for (x=0; x<datalen; x++) {
3202 newSFObject = JS_ConstructObjectFw(cx,&SFColorClass,NULL, newMFObject);
3203 if ((SFRPptr = (SFColorNative *)JS_GetPrivateFw(cx, newSFObject)) == NULL) {
3204 ConsoleMessage (
"failure in getting SF class at %s:%d\n",__FILE__,__LINE__);
3209 fp = (
float *)fp_in; SFRPptr->v.c[0] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3210 fp = (
float *)fp_in; SFRPptr->v.c[1] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3211 fp = (
float *)fp_in; SFRPptr->v.c[2] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3214 if (!JS_DefineElement(cx, newMFObject, (jsint) x, OBJECT_TO_JSVAL(newSFObject),
3215 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3216 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3221 SET_LENGTH (cx,newMFObject,datalen)
3224 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3227 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3228 RUN_FUNCTION(toname)
3232 case FIELDTYPE_MFVec2f: {
3233 JSObject *newMFObject;
3234 JSObject *newSFObject;
3235 SFVec2fNative *SFRPptr;
3236 float *fp, *fp_in=(
float *)Data;
3239 newMFObject = JS_ConstructObjectFw(cx, &MFVec2fClass, NULL ,JS_GetParentFw(cx, obj));
3240 ADD_ROOT (cx, newMFObject)
3243 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3246 elementlen = (int)
sizeof (
float);
3247 for (x=0; x<datalen; x++) {
3249 newSFObject = JS_ConstructObjectFw(cx,&SFVec2fClass,NULL, newMFObject);
3250 if ((SFRPptr = (SFVec2fNative *)JS_GetPrivateFw(cx, newSFObject)) == NULL) {
3251 ConsoleMessage (
"failure in getting SF class at %s:%d\n",__FILE__,__LINE__);
3256 fp = (
float *)fp_in; SFRPptr->v.c[0] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3257 fp = (
float *)fp_in; SFRPptr->v.c[1] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3260 if (!JS_DefineElement(cx, newMFObject, (jsint) x, OBJECT_TO_JSVAL(newSFObject),
3261 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3262 ConsoleMessage(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3267 SET_LENGTH (cx,newMFObject,datalen)
3270 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3273 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3274 RUN_FUNCTION(toname)
3279 case FIELDTYPE_MFFloat: {
3280 JSObject *newMFObject;
3282 float *fp, *fp_in=(
float *)Data;
3284 newMFObject = JS_ConstructObjectFw(cx, &MFFloatClass, NULL ,JS_GetParentFw(cx, obj));
3285 ADD_ROOT (cx, newMFObject)
3288 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3291 elementlen = (int)
sizeof (
float);
3292 for (x=0; x<datalen; x++) {
3295 fp = (
float *)fp_in;
3296 JS_NewNumberValue(cx,(
double)*fp,&newjsval);
3297 fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3300 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3301 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3302 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3307 SET_LENGTH (cx,newMFObject,datalen)
3310 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3313 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3314 RUN_FUNCTION(toname)
3317 case FIELDTYPE_MFTime: {
3318 JSObject *newMFObject;
3320 double *dp, *dp_in=(
double *)Data;
3323 newMFObject = JS_ConstructObjectFw(cx, &MFTimeClass, NULL ,JS_GetParentFw(cx, obj));
3324 ADD_ROOT (cx, newMFObject)
3327 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3330 elementlen = (int)
sizeof (
double);
3331 for (x=0; x<datalen; x++) {
3334 dp = (
double *)dp_in;
3335 JS_NewNumberValue(cx,(
double)*dp,&newjsval);
3336 dp_in = offsetPointer_deref(
double *,dp_in,elementlen);
3339 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3340 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3341 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3346 SET_LENGTH (cx,newMFObject,datalen)
3349 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3352 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3353 RUN_FUNCTION(toname)
3356 case FIELDTYPE_MFInt32: {
3357 JSObject *newMFObject;
3359 int *ip, *ip_in=(
int *)Data;
3362 newMFObject = JS_ConstructObjectFw(cx, &MFInt32Class, NULL ,JS_GetParentFw(cx, obj));
3363 ADD_ROOT (cx, newMFObject)
3366 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3369 elementlen = (int)
sizeof (
float);
3370 for (x=0; x<datalen; x++) {
3374 newjsval = INT_TO_JSVAL((
int)*ip);
3375 ip_in = offsetPointer_deref(
int *,ip_in,elementlen);
3378 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3379 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3380 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3385 SET_LENGTH (cx,newMFObject,datalen)
3388 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3391 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3392 RUN_FUNCTION(toname)
3395 case FIELDTYPE_MFString: {
3396 JSObject *newMFObject;
3401 newMFObject = JS_ConstructObjectFw(cx, &MFStringClass, NULL ,JS_GetParentFw(cx, obj));
3402 ADD_ROOT (cx, newMFObject)
3408 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3411 for (x=0; x<datalen; x++) {
3414 chptr = uniptr[x]->strptr;
3415 newjsval = STRING_TO_JSVAL( JS_NewStringCopyZ(cx,chptr));
3418 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3419 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3420 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3425 SET_LENGTH (cx,newMFObject,datalen)
3428 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3431 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3432 RUN_FUNCTION(toname)
3435 case FIELDTYPE_MFNode: {
3436 JSObject *newMFObject;
3438 void **ip, **ip_in=(
void **)Data;
3440 newMFObject = JS_ConstructObjectFw(cx, &MFNodeClass, NULL ,JS_GetParentFw(cx, obj));
3441 ADD_ROOT (cx, newMFObject)
3444 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3447 elementlen = (int)
sizeof (
void *);
3448 for (x=0; x<datalen; x++) {
3450 newjsval = PRIVATE_TO_JSVAL((
void*)*ip);
3451 ip_in = offsetPointer_deref(
void **,ip_in,elementlen);
3454 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3455 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3456 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3461 SET_LENGTH (cx,newMFObject,datalen)
3464 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3467 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3468 RUN_FUNCTION(toname)
3472 case FIELDTYPE_SFImage: {
3473 JSObject *newMFObject;
3475 int *ip_in=(
int *)Data;
3478 newMFObject = JS_ConstructObjectFw(cx, &SFImageClass, NULL ,JS_GetParentFw(cx, obj));
3479 ADD_ROOT (cx, newMFObject)
3482 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3485 for (x=0; x<datalen; x++) {
3486 newjsval = INT_TO_JSVAL(ip_in[x]);
3488 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3489 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3490 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3495 SET_LENGTH (cx,newMFObject,datalen)
3498 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3501 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3502 RUN_FUNCTION(toname)
3508 printf (
"setMFElement, SHOULD NOT DISPLAY THIS\n");
3509 strcat (scriptline,
"(");
3530void **getInternalDataPointerForJavascriptObject(JSContext *cx, JSObject *obj,
int tnfield,
int *iflag) {
3531 char scriptline[256];
3540 if(JSparamnames[tnfield].kind == PKW_inputOnly)
3541 strcat(scriptline,
"__eventIn_Value_");
3542 strcat(scriptline,JSparamnames[tnfield].name);
3543 #ifdef SETFIELDVERBOSE
3544 printf (
"getInternalDataPointerForJavascriptObject: line %s\n",scriptline);
3547 if (!JS_GetProperty(cx,obj,scriptline,&retval)){
3552 printf (
"JS_GetProperty failed in set_one_MultiElementType.\n");
3557 if(!retval.isObject()){
3562 if (!JS_GetProperty(cx,obj,JSparamnames[tnfield].name,&retval)){
3564 printf (
"no field for eventIn function: %s\n",JSparamnames[tnfield].name);
3568 if(!retval.isObject()){
3569 printf (
"no field for eventIn function: %s\n",JSparamnames[tnfield].name);
3575 sfObj = JSVAL_TO_OBJECT(retval);
3577 if ((_privPtr = JS_GetPrivateFw(cx, sfObj)) == NULL)
3578 printf(
"JS_GetPrivate failed set_one_MultiElementType.\n");
3580 if (_privPtr == NULL)
return NULL;
3587 if (JS_InstanceOf(cx, sfObj, &SFVec3fClass, NULL)) {
3588 SFVec3fNative *me = (SFVec3fNative *)_privPtr;
3589 return (
void **) &me->v;
3591 }
else if (JS_InstanceOf(cx, sfObj, &SFVec3dClass, NULL)) {
3592 SFVec3dNative *me = (SFVec3dNative *)_privPtr;
3593 return (
void **) &me->v;
3595 }
else if (JS_InstanceOf(cx, sfObj, &SFRotationClass, NULL)) {
3596 SFRotationNative *me = (SFRotationNative *)_privPtr;
3597 return (
void **) &me->v;
3599 }
else if (JS_InstanceOf(cx, sfObj, &SFVec2fClass, NULL)) {
3600 SFVec2fNative *me = (SFVec2fNative *)_privPtr;
3601 return (
void **) &me->v;
3603 }
else if (JS_InstanceOf(cx, sfObj, &SFColorClass, NULL)) {
3604 SFColorNative *me = (SFColorNative *)_privPtr;
3605 return (
void **) &me->v;
3607 }
else if (JS_InstanceOf(cx, sfObj, &SFColorRGBAClass, NULL)) {
3608 SFColorRGBANative *me = (SFColorRGBANative *)_privPtr;
3609 return (
void **) &me->v;
3611 }
else if (JS_InstanceOf(cx, sfObj, &SFVec4fClass, NULL)) {
3612 SFVec4fNative *me = (SFVec4fNative *)_privPtr;
3613 return (
void **) &me->v;
3615 }
else if (JS_InstanceOf(cx, sfObj, &SFVec4dClass, NULL)) {
3616 SFVec4dNative *me = (SFVec4dNative *)_privPtr;
3617 return (
void **) &me->v;
3619 }
else if (JS_InstanceOf(cx, sfObj, &SFNodeClass, NULL)) {
3620 SFNodeNative *me = (SFNodeNative *)_privPtr;
3621 return (
void **) &me->handle;;
3624 }
else if (JS_InstanceOf(cx, sfObj, &SFImageClass, NULL)) {
3630 ConsoleMessage (
"getInternalDataPointerForJavascriptObject malfunction");
3645void sm_set_one_MultiElementType (
int tonode,
int tnfield,
void *Data,
int dataLen ) {
3646 char scriptline[256];
3650 int iflag, kind, toname;
3651 ttglobal tg = gglobal();
3652 ppJScript p = (ppJScript)tg->JScript.prv;
3658 ScriptControl = getScriptControlIndex(tonode);
3659 if (ScriptControl->thisScriptType == NOSCRIPT)
return;
3660 cx = (JSContext*)ScriptControl->cx;
3661 obj = (JSObject*)ScriptControl->glob;
3665 JSAutoRequest ar(cx);
3668 JSAutoCompartment ac(cx, obj);
3670 kind = JSparamnames[toname].kind;
3671 if (SM_method() == 2) {
3672 int type, iifield, * valueChanged, ifound, datatype;
3677 fieldname = JSparamnames[toname].name;
3678 datatype = JSparamnames[toname].type;
3681 ifound = getFieldFromScript(script, fieldname, &type, &kind, &iifield, &value, &valueChanged);
3682 if (ifound && type == datatype && isSFType(type)) {
3684 shallow_copy_field(type, (
union anyVrml*)Data, value);
3685 (*valueChanged) = 1;
3688 ConsoleMessage(
"sm_set_one_MultiElementType did not find field %s type %d\n", fieldname, datatype);
3693 FW_MaybeGC(
"TT", cx);
3699 JSScript* hscript = NULL;
3700 JS::RootedScript rscript(cx, hscript);
3705 int tnfield = toname;
3706 if (JSparamnames[tnfield].eventInFunction == NULL || TRUE) {
3707 if (kind == PKW_inputOutput)
3708 sprintf(scriptline,
"set_%s(%s,__eventInTickTime)", JSparamnames[tnfield].name, JSparamnames[tnfield].name);
3710 sprintf(scriptline,
"%s(%s%s,__eventInTickTime)", JSparamnames[tnfield].name,
"__eventIn_Value_", JSparamnames[tnfield].name);
3712 hscript = JS_CompileScript(
3713 cx, obj, scriptline, strlen(scriptline),
"compile eventIn", 1);
3714 JSparamnames[tnfield].eventInFunction = (
void*)hscript;
3717 if (0)
if (!JS_AddObjectRoot(cx, (JSObject**)(&JSparamnames[tnfield].eventInFunction))) {
3718 printf(
"JS_AddObjectRoot failed for compilation of script \"%s\" at %s:%d.\n", scriptline, __FILE__, __LINE__);
3724 FW_MaybeGC(
"SOMET CF", cx);
3732 int tnfield = toname;
3735 if (!JS_ExecuteScript(cx, obj, (JSScript*)JSparamnames[tnfield].eventInFunction, &zimbo)) {
3736 printf(
"eventIn %s failed to complete successfully, in FreeWRL code %s:%d\n", JSparamnames[tnfield].name, __FILE__, __LINE__);
3742 FW_MaybeGC(
"SOMET RF", cx);
3752 pp = getInternalDataPointerForJavascriptObject(cx, obj, tnfield, &iflag);
3755 printf(
"function not found\n");
3758 memcpy(pp, Data, dataLen);
3766 COMPILE_FUNCTION_IF_NEEDED_SET(tnfield, kind)
3768 RUN_FUNCTION(tnfield)
3775int sm_runQueuedDirectOutputs(){