static void *print(void *arg) { int val; inline_as3("var abc:int = this[\"abc\"];"); AS3_GetScalarFromVar(val, abc); printf("Val: %d\n",val); return 0; }
static void *threadProc(void *arg) { inline_as3("this[\"abc\"]=3333;"); avm2_self_msleep((void*)&main_tid, 10); avm2_thr_impersonate(main_tid,print,NULL); avm2_wake((void*)&main_tid); // printf("thread. main id is %d\n",main_tid); // avm2_ui_thunk(print, NULL); return NULL; }
int main() { long mid; thr_self(&mid); printf("main_tid: %d\n",mid); main_tid = mid; inline_as3("this[\"abc\"]=8888;"); inline_as3("var af:Function = function(){};"); avm2_ui_thunk(assign, NULL); avm2_ui_thunk(print, NULL); for(int i = 0; i < sNumThreads; i++) pthread_create(sThreads + i, NULL, threadProc, (void *)i); for(int i = 0; i < sNumThreads; i++) pthread_join(sThreads[i], NULL); AS3_GoAsync(); return 0; }
extern "C" void compileShader() { // Copy the AS3 string to the C heap (must be free'd later) char *src = NULL; AS3_MallocString(src, src); bool gles = false; AS3_CopyScalarToVar(gles, gles); glslopt_ctx* gContext = glslopt_initialize(gles); int mode; AS3_GetScalarFromVar(mode, mode); const glslopt_shader_type type = mode == 0 ? kGlslOptShaderVertex : kGlslOptShaderFragment; glslopt_shader* shader = glslopt_optimize(gContext, type, src, 0); const char* optimizedShader = glslopt_get_output(shader); AS3_DeclareVar(outputstr, String); AS3_CopyCStringToVar(outputstr, optimizedShader, strlen(optimizedShader)); glslopt_cleanup(gContext); //optimize shader and/or turn sampler instructions into easily //replaceable aliases (for generating sampler variations at runtime) inline_as3( "import com.adobe.AGALOptimiser.translator.transformations.Utils;\n" "var shader:Object = null;\n" "try { shader = JSON.parse(outputstr) } catch(e:*) { }\n" "if(shader != null && shader[\"agalasm\"] != null) {\n" " if(optimize)\n" " shader = Utils.optimizeShader(shader, mode == 0)\n" " shader[\"agalasm\"] = Utils.processSamplers(shader[\"agalasm\"]);\n" " outputstr = JSON.stringify(shader, null, 1)\n" "}\n" ); AS3_ReturnAS3Var(outputstr); }
extern "C" void compileShader() { // Copy the AS3 string to the C heap (must be free'd later) char *src = NULL; AS3_MallocString(src, src); bool gles = false; AS3_CopyScalarToVar(gles, gles); glslopt_ctx* gContext = glslopt_initialize(gles); int mode; AS3_GetScalarFromVar(mode, mode); const glslopt_shader_type type = mode == 0 ? kGlslOptShaderVertex : kGlslOptShaderFragment; glslopt_shader* shader = glslopt_optimize(gContext, type, src, 0); const char* optimizedShader = glslopt_get_output(shader); AS3_DeclareVar(outputstr, String); AS3_CopyCStringToVar(outputstr, optimizedShader, strlen(optimizedShader)); glslopt_cleanup(gContext); inline_as3( "import com.adobe.AGALOptimiser.translator.transformations.Utils;\n" "if(optimize) {\n" " var shader:Object = JSON.parse(outputstr)\n" " if(shader[\"agalasm\"] != null) {\n" " shader = Utils.optimizeShader(shader, mode == 0)\n" " outputstr = JSON.stringify(shader)\n" " }\n" "}\n" ); AS3_ReturnAS3Var(outputstr); }
// this function returns a strdup-ed string instead of printing directly // because it will be called by avm2_ui_thunk where C I/O is unsafe static void *assign(void *arg) { inline_as3("this[\"abc\"]=2222;"); return 0; }