public static int SetInterval(IntPtr ctx) { DuktapeFunction fn; var idx = _GetTimerFunction(ctx, out fn); if (idx < 0) { var id = DuktapeRunner.SetInterval(fn, DuktapeDLL.duk_get_int(ctx, 1)); DuktapeDLL.duk_push_uint(ctx, id); return(1); } return(DuktapeDLL.duk_generic_error(ctx, "invalid arg " + idx)); }
private IEnumerator _InitializeStep(IDuktapeListener listener, int step) { DuktapeDLL.duk_push_global_object(ctx); DuktapeJSBuiltins.reg(ctx); listener?.OnTypesBinding(this); var ctxAsArgs = new object[] { ctx }; var bindingTypes = new List <Type>(); var assemblies = AppDomain.CurrentDomain.GetAssemblies(); for (int assemblyIndex = 0, assemblyCount = assemblies.Length; assemblyIndex < assemblyCount; assemblyIndex++) { var assembly = assemblies[assemblyIndex]; try { if (assembly.IsDynamic) { continue; } var exportedTypes = assembly.GetExportedTypes(); for (int i = 0, size = exportedTypes.Length; i < size; i++) { var type = exportedTypes[i]; #if UNITY_EDITOR if (type.IsDefined(typeof(JSAutoRunAttribute), false)) { try { var run = type.GetMethod("Run", BindingFlags.Static | BindingFlags.Public); if (run != null) { run.Invoke(null, null); } } catch (Exception exception) { Debug.LogWarning($"JSAutoRun failed: {exception}"); } continue; } #endif var attributes = type.GetCustomAttributes(typeof(JSBindingAttribute), false); if (attributes.Length == 1) { var jsBinding = attributes[0] as JSBindingAttribute; if (jsBinding.Version == 0 || jsBinding.Version == VERSION) { bindingTypes.Add(type); } else { if (listener != null) { listener.OnBindingError(this, type); } } } } } catch (Exception e) { Debug.LogErrorFormat("assembly: {0}, {1}", assembly, e); } } var numRegInvoked = bindingTypes.Count; for (var i = 0; i < numRegInvoked; ++i) { var type = bindingTypes[i]; var reg = type.GetMethod("reg"); if (reg != null) { reg.Invoke(null, ctxAsArgs); if (listener != null) { listener.OnProgress(this, i, numRegInvoked); } if (i % step == 0) { yield return(null); } } } if (listener != null) { listener.OnBinded(this, numRegInvoked); } // Debug.LogFormat("exported {0} classes", _exported.Count); // 设置导出类的继承链 foreach (var kv in _exported) { var type = kv.Key; var baseType = type.BaseType; if (baseType == null) { // Debug.Log($"baseType is null, for {type}"); continue; } var fn = kv.Value; fn.PushPrototype(ctx); if (PushChainedPrototypeOf(ctx, baseType)) { // Debug.LogFormat($"set {type} super {baseType}"); DuktapeDLL.duk_set_prototype(ctx, -2); } else { Debug.LogWarning($"fail to push prototype, for {type}: {baseType}"); } DuktapeDLL.duk_pop(ctx); } DuktapeJSBuiltins.postreg(ctx); DuktapeDLL.duk_pop(ctx); // pop global _updateTimer = DuktapeRunner.SetInterval(this.OnUpdate, 100); if (listener != null) { listener.OnLoaded(this); } }