func.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113
  1. package goja
  2. import (
  3. "fmt"
  4. "reflect"
  5. "github.com/dop251/goja/unistring"
  6. )
  7. type resultType uint8
  8. const (
  9. resultNormal resultType = iota
  10. resultYield
  11. resultYieldRes // a yield that expects a value in return
  12. resultYieldDelegate // yield*
  13. resultYieldDelegateRes
  14. resultAwait
  15. )
  16. // used both as an instruction and as a Value
  17. type yieldMarker struct {
  18. valueNull
  19. resultType resultType
  20. }
  21. var (
  22. await = &yieldMarker{resultType: resultAwait}
  23. yield = &yieldMarker{resultType: resultYield}
  24. yieldRes = &yieldMarker{resultType: resultYieldRes}
  25. yieldDelegate = &yieldMarker{resultType: resultYieldDelegate}
  26. yieldDelegateRes = &yieldMarker{resultType: resultYieldDelegateRes}
  27. yieldEmpty = &yieldMarker{resultType: resultYield}
  28. )
  29. // AsyncContextTracker is a handler that allows to track an async execution context to ensure it remains
  30. // consistent across all callback invocations.
  31. // Whenever a Promise reaction job is scheduled the Grab method is called. It is supposed to return the
  32. // current context. The same context will be supplied to the Resumed method before the reaction job is
  33. // executed. The Exited method is called after the reaction job is finished.
  34. // This means that for each invocation of the Grab method there will be exactly one subsequent invocation
  35. // of Resumed and then Exited methods (assuming the Promise is fulfilled or rejected). Also, the Resumed/Exited
  36. // calls cannot be nested, so Exited can simply clear the current context instead of popping from a stack.
  37. // Note, this works for both async functions and regular Promise.then()/Promise.catch() callbacks.
  38. // See TestAsyncContextTracker for more insight.
  39. //
  40. // To register it call Runtime.SetAsyncContextTracker().
  41. type AsyncContextTracker interface {
  42. Grab() (trackingObject interface{})
  43. Resumed(trackingObject interface{})
  44. Exited()
  45. }
  46. type funcObjectImpl interface {
  47. source() String
  48. }
  49. type baseFuncObject struct {
  50. baseObject
  51. lenProp valueProperty
  52. }
  53. type baseJsFuncObject struct {
  54. baseFuncObject
  55. stash *stash
  56. privEnv *privateEnv
  57. prg *Program
  58. src string
  59. strict bool
  60. }
  61. type funcObject struct {
  62. baseJsFuncObject
  63. }
  64. type generatorFuncObject struct {
  65. baseJsFuncObject
  66. }
  67. type asyncFuncObject struct {
  68. baseJsFuncObject
  69. }
  70. type classFuncObject struct {
  71. baseJsFuncObject
  72. initFields *Program
  73. computedKeys []Value
  74. privateEnvType *privateEnvType
  75. privateMethods []Value
  76. derived bool
  77. }
  78. type methodFuncObject struct {
  79. baseJsFuncObject
  80. homeObject *Object
  81. }
  82. type generatorMethodFuncObject struct {
  83. methodFuncObject
  84. }
  85. type asyncMethodFuncObject struct {
  86. methodFuncObject
  87. }
  88. type arrowFuncObject struct {
  89. baseJsFuncObject
  90. funcObj *Object
  91. newTarget Value
  92. }
  93. type asyncArrowFuncObject struct {
  94. arrowFuncObject
  95. }
  96. type nativeFuncObject struct {
  97. baseFuncObject
  98. f func(FunctionCall) Value
  99. construct func(args []Value, newTarget *Object) *Object
  100. }
  101. type wrappedFuncObject struct {
  102. nativeFuncObject
  103. wrapped reflect.Value
  104. }
  105. type boundFuncObject struct {
  106. nativeFuncObject
  107. wrapped *Object
  108. }
  109. type generatorState uint8
  110. const (
  111. genStateUndefined generatorState = iota
  112. genStateSuspendedStart
  113. genStateExecuting
  114. genStateSuspendedYield
  115. genStateSuspendedYieldRes
  116. genStateCompleted
  117. )
  118. type generatorObject struct {
  119. baseObject
  120. gen generator
  121. delegated *iteratorRecord
  122. state generatorState
  123. }
  124. func (f *nativeFuncObject) source() String {
  125. return newStringValue(fmt.Sprintf("function %s() { [native code] }", nilSafe(f.getStr("name", nil)).toString()))
  126. }
  127. func (f *nativeFuncObject) export(*objectExportCtx) interface{} {
  128. return f.f
  129. }
  130. func (f *wrappedFuncObject) exportType() reflect.Type {
  131. return f.wrapped.Type()
  132. }
  133. func (f *wrappedFuncObject) export(*objectExportCtx) interface{} {
  134. return f.wrapped.Interface()
  135. }
  136. func (f *funcObject) _addProto(n unistring.String) Value {
  137. if n == "prototype" {
  138. if _, exists := f.values[n]; !exists {
  139. return f.addPrototype()
  140. }
  141. }
  142. return nil
  143. }
  144. func (f *funcObject) getStr(p unistring.String, receiver Value) Value {
  145. return f.getStrWithOwnProp(f.getOwnPropStr(p), p, receiver)
  146. }
  147. func (f *funcObject) getOwnPropStr(name unistring.String) Value {
  148. if v := f._addProto(name); v != nil {
  149. return v
  150. }
  151. return f.baseObject.getOwnPropStr(name)
  152. }
  153. func (f *funcObject) setOwnStr(name unistring.String, val Value, throw bool) bool {
  154. f._addProto(name)
  155. return f.baseObject.setOwnStr(name, val, throw)
  156. }
  157. func (f *funcObject) setForeignStr(name unistring.String, val, receiver Value, throw bool) (bool, bool) {
  158. return f._setForeignStr(name, f.getOwnPropStr(name), val, receiver, throw)
  159. }
  160. func (f *funcObject) defineOwnPropertyStr(name unistring.String, descr PropertyDescriptor, throw bool) bool {
  161. f._addProto(name)
  162. return f.baseObject.defineOwnPropertyStr(name, descr, throw)
  163. }
  164. func (f *funcObject) deleteStr(name unistring.String, throw bool) bool {
  165. f._addProto(name)
  166. return f.baseObject.deleteStr(name, throw)
  167. }
  168. func (f *funcObject) addPrototype() Value {
  169. proto := f.val.runtime.NewObject()
  170. proto.self._putProp("constructor", f.val, true, false, true)
  171. return f._putProp("prototype", proto, true, false, false)
  172. }
  173. func (f *funcObject) hasOwnPropertyStr(name unistring.String) bool {
  174. if f.baseObject.hasOwnPropertyStr(name) {
  175. return true
  176. }
  177. if name == "prototype" {
  178. return true
  179. }
  180. return false
  181. }
  182. func (f *funcObject) stringKeys(all bool, accum []Value) []Value {
  183. if all {
  184. if _, exists := f.values["prototype"]; !exists {
  185. accum = append(accum, asciiString("prototype"))
  186. }
  187. }
  188. return f.baseFuncObject.stringKeys(all, accum)
  189. }
  190. func (f *funcObject) iterateStringKeys() iterNextFunc {
  191. if _, exists := f.values["prototype"]; !exists {
  192. f.addPrototype()
  193. }
  194. return f.baseFuncObject.iterateStringKeys()
  195. }
  196. func (f *baseFuncObject) createInstance(newTarget *Object) *Object {
  197. r := f.val.runtime
  198. if newTarget == nil {
  199. newTarget = f.val
  200. }
  201. proto := r.getPrototypeFromCtor(newTarget, nil, r.global.ObjectPrototype)
  202. return f.val.runtime.newBaseObject(proto, classObject).val
  203. }
  204. func (f *baseJsFuncObject) source() String {
  205. return newStringValue(f.src)
  206. }
  207. func (f *baseJsFuncObject) construct(args []Value, newTarget *Object) *Object {
  208. if newTarget == nil {
  209. newTarget = f.val
  210. }
  211. proto := newTarget.self.getStr("prototype", nil)
  212. var protoObj *Object
  213. if p, ok := proto.(*Object); ok {
  214. protoObj = p
  215. } else {
  216. protoObj = f.val.runtime.global.ObjectPrototype
  217. }
  218. obj := f.val.runtime.newBaseObject(protoObj, classObject).val
  219. ret := f.call(FunctionCall{
  220. This: obj,
  221. Arguments: args,
  222. }, newTarget)
  223. if ret, ok := ret.(*Object); ok {
  224. return ret
  225. }
  226. return obj
  227. }
  228. func (f *classFuncObject) Call(FunctionCall) Value {
  229. panic(f.val.runtime.NewTypeError("Class constructor cannot be invoked without 'new'"))
  230. }
  231. func (f *classFuncObject) assertCallable() (func(FunctionCall) Value, bool) {
  232. return f.Call, true
  233. }
  234. func (f *classFuncObject) vmCall(vm *vm, n int) {
  235. f.Call(FunctionCall{})
  236. }
  237. func (f *classFuncObject) exportType() reflect.Type {
  238. return reflectTypeCtor
  239. }
  240. func (f *classFuncObject) Construct(ccall ConstructorCall) *Object {
  241. return f.construct(ccall.Arguments, ccall.NewTarget)
  242. }
  243. func (f *classFuncObject) export(*objectExportCtx) interface{} {
  244. return f.Construct
  245. }
  246. func (f *classFuncObject) createInstance(args []Value, newTarget *Object) (instance *Object) {
  247. if f.derived {
  248. if ctor := f.prototype.self.assertConstructor(); ctor != nil {
  249. instance = ctor(args, newTarget)
  250. } else {
  251. panic(f.val.runtime.NewTypeError("Super constructor is not a constructor"))
  252. }
  253. } else {
  254. instance = f.baseFuncObject.createInstance(newTarget)
  255. }
  256. return
  257. }
  258. func (f *classFuncObject) _initFields(instance *Object) {
  259. if f.privateEnvType != nil {
  260. penv := instance.self.getPrivateEnv(f.privateEnvType, true)
  261. penv.methods = f.privateMethods
  262. }
  263. if f.initFields != nil {
  264. vm := f.val.runtime.vm
  265. vm.pushCtx()
  266. vm.prg = f.initFields
  267. vm.stash = f.stash
  268. vm.privEnv = f.privEnv
  269. vm.newTarget = nil
  270. // so that 'super' base could be correctly resolved (including from direct eval())
  271. vm.push(f.val)
  272. vm.sb = vm.sp
  273. vm.push(instance)
  274. vm.pc = 0
  275. ex := vm.runTry()
  276. vm.popCtx()
  277. if ex != nil {
  278. panic(ex)
  279. }
  280. vm.sp -= 2
  281. }
  282. }
  283. func (f *classFuncObject) construct(args []Value, newTarget *Object) *Object {
  284. if newTarget == nil {
  285. newTarget = f.val
  286. }
  287. if f.prg == nil {
  288. instance := f.createInstance(args, newTarget)
  289. f._initFields(instance)
  290. return instance
  291. } else {
  292. var instance *Object
  293. var thisVal Value
  294. if !f.derived {
  295. instance = f.createInstance(args, newTarget)
  296. f._initFields(instance)
  297. thisVal = instance
  298. }
  299. ret := f._call(args, newTarget, thisVal)
  300. if ret, ok := ret.(*Object); ok {
  301. return ret
  302. }
  303. if f.derived {
  304. r := f.val.runtime
  305. if ret != _undefined {
  306. panic(r.NewTypeError("Derived constructors may only return object or undefined"))
  307. }
  308. if v := r.vm.stack[r.vm.sp+1]; v != nil { // using residual 'this' value (a bit hacky)
  309. instance = r.toObject(v)
  310. } else {
  311. panic(r.newError(r.getReferenceError(), "Must call super constructor in derived class before returning from derived constructor"))
  312. }
  313. }
  314. return instance
  315. }
  316. }
  317. func (f *classFuncObject) assertConstructor() func(args []Value, newTarget *Object) *Object {
  318. return f.construct
  319. }
  320. func (f *baseJsFuncObject) Call(call FunctionCall) Value {
  321. return f.call(call, nil)
  322. }
  323. func (f *arrowFuncObject) Call(call FunctionCall) Value {
  324. return f._call(call.Arguments, f.newTarget, nil)
  325. }
  326. func (f *baseJsFuncObject) __call(args []Value, newTarget, this Value) (Value, *Exception) {
  327. vm := f.val.runtime.vm
  328. vm.stack.expand(vm.sp + len(args) + 1)
  329. vm.stack[vm.sp] = f.val
  330. vm.sp++
  331. vm.stack[vm.sp] = this
  332. vm.sp++
  333. for _, arg := range args {
  334. if arg != nil {
  335. vm.stack[vm.sp] = arg
  336. } else {
  337. vm.stack[vm.sp] = _undefined
  338. }
  339. vm.sp++
  340. }
  341. vm.pushTryFrame(tryPanicMarker, -1)
  342. defer vm.popTryFrame()
  343. var needPop bool
  344. if vm.prg != nil {
  345. vm.pushCtx()
  346. vm.callStack = append(vm.callStack, context{pc: -2}) // extra frame so that run() halts after ret
  347. needPop = true
  348. } else {
  349. vm.pc = -2
  350. vm.pushCtx()
  351. }
  352. vm.args = len(args)
  353. vm.prg = f.prg
  354. vm.stash = f.stash
  355. vm.privEnv = f.privEnv
  356. vm.newTarget = newTarget
  357. vm.pc = 0
  358. for {
  359. ex := vm.runTryInner()
  360. if ex != nil {
  361. return nil, ex
  362. }
  363. if vm.halted() {
  364. break
  365. }
  366. }
  367. if needPop {
  368. vm.popCtx()
  369. }
  370. return vm.pop(), nil
  371. }
  372. func (f *baseJsFuncObject) _call(args []Value, newTarget, this Value) Value {
  373. res, ex := f.__call(args, newTarget, this)
  374. if ex != nil {
  375. panic(ex)
  376. }
  377. return res
  378. }
  379. func (f *baseJsFuncObject) call(call FunctionCall, newTarget Value) Value {
  380. return f._call(call.Arguments, newTarget, nilSafe(call.This))
  381. }
  382. func (f *baseJsFuncObject) export(*objectExportCtx) interface{} {
  383. return f.Call
  384. }
  385. func (f *baseFuncObject) exportType() reflect.Type {
  386. return reflectTypeFunc
  387. }
  388. func (f *baseFuncObject) typeOf() String {
  389. return stringFunction
  390. }
  391. func (f *baseJsFuncObject) assertCallable() (func(FunctionCall) Value, bool) {
  392. return f.Call, true
  393. }
  394. func (f *funcObject) assertConstructor() func(args []Value, newTarget *Object) *Object {
  395. return f.construct
  396. }
  397. func (f *baseJsFuncObject) vmCall(vm *vm, n int) {
  398. vm.pushCtx()
  399. vm.args = n
  400. vm.prg = f.prg
  401. vm.stash = f.stash
  402. vm.privEnv = f.privEnv
  403. vm.pc = 0
  404. vm.stack[vm.sp-n-1], vm.stack[vm.sp-n-2] = vm.stack[vm.sp-n-2], vm.stack[vm.sp-n-1]
  405. }
  406. func (f *arrowFuncObject) assertCallable() (func(FunctionCall) Value, bool) {
  407. return f.Call, true
  408. }
  409. func (f *arrowFuncObject) vmCall(vm *vm, n int) {
  410. vm.pushCtx()
  411. vm.args = n
  412. vm.prg = f.prg
  413. vm.stash = f.stash
  414. vm.privEnv = f.privEnv
  415. vm.pc = 0
  416. vm.stack[vm.sp-n-1], vm.stack[vm.sp-n-2] = nil, vm.stack[vm.sp-n-1]
  417. vm.newTarget = f.newTarget
  418. }
  419. func (f *arrowFuncObject) export(*objectExportCtx) interface{} {
  420. return f.Call
  421. }
  422. func (f *baseFuncObject) init(name unistring.String, length Value) {
  423. f.baseObject.init()
  424. f.lenProp.configurable = true
  425. f.lenProp.value = length
  426. f._put("length", &f.lenProp)
  427. f._putProp("name", stringValueFromRaw(name), false, false, true)
  428. }
  429. func hasInstance(val *Object, v Value) bool {
  430. if v, ok := v.(*Object); ok {
  431. o := val.self.getStr("prototype", nil)
  432. if o1, ok := o.(*Object); ok {
  433. for {
  434. v = v.self.proto()
  435. if v == nil {
  436. return false
  437. }
  438. if o1 == v {
  439. return true
  440. }
  441. }
  442. } else {
  443. panic(val.runtime.NewTypeError("prototype is not an object"))
  444. }
  445. }
  446. return false
  447. }
  448. func (f *baseFuncObject) hasInstance(v Value) bool {
  449. return hasInstance(f.val, v)
  450. }
  451. func (f *nativeFuncObject) defaultConstruct(ccall func(ConstructorCall) *Object, args []Value, newTarget *Object) *Object {
  452. obj := f.createInstance(newTarget)
  453. ret := ccall(ConstructorCall{
  454. This: obj,
  455. Arguments: args,
  456. NewTarget: newTarget,
  457. })
  458. if ret != nil {
  459. return ret
  460. }
  461. return obj
  462. }
  463. func (f *nativeFuncObject) assertCallable() (func(FunctionCall) Value, bool) {
  464. if f.f != nil {
  465. return f.f, true
  466. }
  467. return nil, false
  468. }
  469. func (f *nativeFuncObject) vmCall(vm *vm, n int) {
  470. if f.f != nil {
  471. vm.pushCtx()
  472. vm.prg = nil
  473. vm.sb = vm.sp - n // so that [sb-1] points to the callee
  474. ret := f.f(FunctionCall{
  475. Arguments: vm.stack[vm.sp-n : vm.sp],
  476. This: vm.stack[vm.sp-n-2],
  477. })
  478. if ret == nil {
  479. ret = _undefined
  480. }
  481. vm.stack[vm.sp-n-2] = ret
  482. vm.popCtx()
  483. } else {
  484. vm.stack[vm.sp-n-2] = _undefined
  485. }
  486. vm.sp -= n + 1
  487. vm.pc++
  488. }
  489. func (f *nativeFuncObject) assertConstructor() func(args []Value, newTarget *Object) *Object {
  490. return f.construct
  491. }
  492. func (f *boundFuncObject) hasInstance(v Value) bool {
  493. return instanceOfOperator(v, f.wrapped)
  494. }
  495. func (f *baseJsFuncObject) prepareForVmCall(call FunctionCall) {
  496. vm := f.val.runtime.vm
  497. args := call.Arguments
  498. vm.stack.expand(vm.sp + len(args) + 1)
  499. vm.stack[vm.sp] = call.This
  500. vm.sp++
  501. vm.stack[vm.sp] = f.val
  502. vm.sp++
  503. for _, arg := range args {
  504. if arg != nil {
  505. vm.stack[vm.sp] = arg
  506. } else {
  507. vm.stack[vm.sp] = _undefined
  508. }
  509. vm.sp++
  510. }
  511. }
  512. func (f *baseJsFuncObject) asyncCall(call FunctionCall, vmCall func(*vm, int)) Value {
  513. f.prepareForVmCall(call)
  514. ar := &asyncRunner{
  515. f: f.val,
  516. vmCall: vmCall,
  517. }
  518. ar.start(len(call.Arguments))
  519. return ar.promiseCap.promise
  520. }
  521. func (f *asyncFuncObject) Call(call FunctionCall) Value {
  522. return f.asyncCall(call, f.baseJsFuncObject.vmCall)
  523. }
  524. func (f *asyncFuncObject) assertCallable() (func(FunctionCall) Value, bool) {
  525. return f.Call, true
  526. }
  527. func (f *asyncFuncObject) export(*objectExportCtx) interface{} {
  528. return f.Call
  529. }
  530. func (f *asyncArrowFuncObject) Call(call FunctionCall) Value {
  531. return f.asyncCall(call, f.arrowFuncObject.vmCall)
  532. }
  533. func (f *asyncArrowFuncObject) assertCallable() (func(FunctionCall) Value, bool) {
  534. return f.Call, true
  535. }
  536. func (f *asyncArrowFuncObject) export(*objectExportCtx) interface{} {
  537. return f.Call
  538. }
  539. func (f *asyncArrowFuncObject) vmCall(vm *vm, n int) {
  540. f.asyncVmCall(vm, n, f.arrowFuncObject.vmCall)
  541. }
  542. func (f *asyncMethodFuncObject) Call(call FunctionCall) Value {
  543. return f.asyncCall(call, f.methodFuncObject.vmCall)
  544. }
  545. func (f *asyncMethodFuncObject) assertCallable() (func(FunctionCall) Value, bool) {
  546. return f.Call, true
  547. }
  548. func (f *asyncMethodFuncObject) export(ctx *objectExportCtx) interface{} {
  549. return f.Call
  550. }
  551. func (f *asyncMethodFuncObject) vmCall(vm *vm, n int) {
  552. f.asyncVmCall(vm, n, f.methodFuncObject.vmCall)
  553. }
  554. func (f *baseJsFuncObject) asyncVmCall(vm *vm, n int, vmCall func(*vm, int)) {
  555. ar := &asyncRunner{
  556. f: f.val,
  557. vmCall: vmCall,
  558. }
  559. ar.start(n)
  560. vm.push(ar.promiseCap.promise)
  561. vm.pc++
  562. }
  563. func (f *asyncFuncObject) vmCall(vm *vm, n int) {
  564. f.asyncVmCall(vm, n, f.baseJsFuncObject.vmCall)
  565. }
  566. type asyncRunner struct {
  567. gen generator
  568. promiseCap *promiseCapability
  569. f *Object
  570. vmCall func(*vm, int)
  571. }
  572. func (ar *asyncRunner) onFulfilled(call FunctionCall) Value {
  573. ar.gen.vm.curAsyncRunner = ar
  574. defer func() {
  575. ar.gen.vm.curAsyncRunner = nil
  576. }()
  577. arg := call.Argument(0)
  578. res, resType, ex := ar.gen.next(arg)
  579. ar.step(res, resType == resultNormal, ex)
  580. return _undefined
  581. }
  582. func (ar *asyncRunner) onRejected(call FunctionCall) Value {
  583. ar.gen.vm.curAsyncRunner = ar
  584. defer func() {
  585. ar.gen.vm.curAsyncRunner = nil
  586. }()
  587. reason := call.Argument(0)
  588. res, resType, ex := ar.gen.nextThrow(reason)
  589. ar.step(res, resType == resultNormal, ex)
  590. return _undefined
  591. }
  592. func (ar *asyncRunner) step(res Value, done bool, ex *Exception) {
  593. r := ar.f.runtime
  594. if done || ex != nil {
  595. if ex == nil {
  596. ar.promiseCap.resolve(res)
  597. } else {
  598. ar.promiseCap.reject(ex.val)
  599. }
  600. return
  601. }
  602. // await
  603. promise := r.promiseResolve(r.getPromise(), res)
  604. promise.self.(*Promise).addReactions(&promiseReaction{
  605. typ: promiseReactionFulfill,
  606. handler: &jobCallback{callback: ar.onFulfilled},
  607. asyncRunner: ar,
  608. }, &promiseReaction{
  609. typ: promiseReactionReject,
  610. handler: &jobCallback{callback: ar.onRejected},
  611. asyncRunner: ar,
  612. })
  613. }
  614. func (ar *asyncRunner) start(nArgs int) {
  615. r := ar.f.runtime
  616. ar.gen.vm = r.vm
  617. ar.promiseCap = r.newPromiseCapability(r.getPromise())
  618. sp := r.vm.sp
  619. ar.gen.enter()
  620. ar.vmCall(r.vm, nArgs)
  621. res, resType, ex := ar.gen.step()
  622. ar.step(res, resType == resultNormal, ex)
  623. if ex != nil {
  624. r.vm.sp = sp - nArgs - 2
  625. }
  626. r.vm.popTryFrame()
  627. r.vm.popCtx()
  628. }
  629. type generator struct {
  630. ctx execCtx
  631. vm *vm
  632. tryStackLen, iterStackLen, refStackLen uint32
  633. }
  634. func (g *generator) storeLengths() {
  635. g.tryStackLen, g.iterStackLen, g.refStackLen = uint32(len(g.vm.tryStack)), uint32(len(g.vm.iterStack)), uint32(len(g.vm.refStack))
  636. }
  637. func (g *generator) enter() {
  638. g.vm.pushCtx()
  639. g.vm.pushTryFrame(tryPanicMarker, -1)
  640. g.vm.prg, g.vm.sb, g.vm.pc = nil, -1, -2 // so that vm.run() halts after ret
  641. g.storeLengths()
  642. }
  643. func (g *generator) step() (res Value, resultType resultType, ex *Exception) {
  644. for {
  645. ex = g.vm.runTryInner()
  646. if ex != nil {
  647. return
  648. }
  649. if g.vm.halted() {
  650. break
  651. }
  652. }
  653. res = g.vm.pop()
  654. if ym, ok := res.(*yieldMarker); ok {
  655. resultType = ym.resultType
  656. g.ctx = execCtx{}
  657. g.vm.pc = -g.vm.pc + 1
  658. if res != yieldEmpty {
  659. res = g.vm.pop()
  660. } else {
  661. res = nil
  662. }
  663. g.vm.suspend(&g.ctx, g.tryStackLen, g.iterStackLen, g.refStackLen)
  664. g.vm.sp = g.vm.sb - 1
  665. g.vm.callStack = g.vm.callStack[:len(g.vm.callStack)-1] // remove the frame with pc == -2, as ret would do
  666. }
  667. return
  668. }
  669. func (g *generator) enterNext() {
  670. g.vm.pushCtx()
  671. g.vm.pushTryFrame(tryPanicMarker, -1)
  672. g.vm.callStack = append(g.vm.callStack, context{pc: -2}) // extra frame so that vm.run() halts after ret
  673. g.storeLengths()
  674. g.vm.resume(&g.ctx)
  675. }
  676. func (g *generator) next(v Value) (Value, resultType, *Exception) {
  677. g.enterNext()
  678. if v != nil {
  679. g.vm.push(v)
  680. }
  681. res, done, ex := g.step()
  682. g.vm.popTryFrame()
  683. g.vm.popCtx()
  684. return res, done, ex
  685. }
  686. func (g *generator) nextThrow(v interface{}) (Value, resultType, *Exception) {
  687. g.enterNext()
  688. ex := g.vm.handleThrow(v)
  689. if ex != nil {
  690. g.vm.popTryFrame()
  691. g.vm.popCtx()
  692. return nil, resultNormal, ex
  693. }
  694. res, resType, ex := g.step()
  695. g.vm.popTryFrame()
  696. g.vm.popCtx()
  697. return res, resType, ex
  698. }
  699. func (g *generatorObject) init(vmCall func(*vm, int), nArgs int) {
  700. g.baseObject.init()
  701. vm := g.val.runtime.vm
  702. g.gen.vm = vm
  703. g.gen.enter()
  704. vmCall(vm, nArgs)
  705. _, _, ex := g.gen.step()
  706. vm.popTryFrame()
  707. if ex != nil {
  708. panic(ex)
  709. }
  710. g.state = genStateSuspendedStart
  711. vm.popCtx()
  712. }
  713. func (g *generatorObject) validate() {
  714. if g.state == genStateExecuting {
  715. panic(g.val.runtime.NewTypeError("Illegal generator state"))
  716. }
  717. }
  718. func (g *generatorObject) step(res Value, resType resultType, ex *Exception) Value {
  719. if ex != nil {
  720. g.delegated = nil
  721. g.state = genStateCompleted
  722. panic(ex)
  723. }
  724. switch resType {
  725. case resultYield:
  726. g.state = genStateSuspendedYield
  727. return g.val.runtime.createIterResultObject(res, false)
  728. case resultYieldDelegate:
  729. g.state = genStateSuspendedYield
  730. return g.delegate(res)
  731. case resultYieldRes:
  732. g.state = genStateSuspendedYieldRes
  733. return g.val.runtime.createIterResultObject(res, false)
  734. case resultYieldDelegateRes:
  735. g.state = genStateSuspendedYieldRes
  736. return g.delegate(res)
  737. case resultNormal:
  738. g.state = genStateCompleted
  739. return g.val.runtime.createIterResultObject(res, true)
  740. default:
  741. panic(g.val.runtime.NewTypeError("Runtime bug: unexpected result type: %v", resType))
  742. }
  743. }
  744. func (g *generatorObject) delegate(v Value) Value {
  745. ex := g.val.runtime.try(func() {
  746. g.delegated = g.val.runtime.getIterator(v, nil)
  747. })
  748. if ex != nil {
  749. g.delegated = nil
  750. g.state = genStateCompleted
  751. return g.step(g.gen.nextThrow(ex))
  752. }
  753. return g.next(_undefined)
  754. }
  755. func (g *generatorObject) tryCallDelegated(fn func() (Value, bool)) (ret Value, done bool) {
  756. ex := g.val.runtime.try(func() {
  757. ret, done = fn()
  758. })
  759. if ex != nil {
  760. g.delegated = nil
  761. g.state = genStateExecuting
  762. return g.step(g.gen.nextThrow(ex)), false
  763. }
  764. return
  765. }
  766. func (g *generatorObject) callDelegated(method func(FunctionCall) Value, v Value) (Value, bool) {
  767. res := g.val.runtime.toObject(method(FunctionCall{This: g.delegated.iterator, Arguments: []Value{v}}))
  768. if iteratorComplete(res) {
  769. g.delegated = nil
  770. return iteratorValue(res), true
  771. }
  772. return res, false
  773. }
  774. func (g *generatorObject) next(v Value) Value {
  775. g.validate()
  776. if g.state == genStateCompleted {
  777. return g.val.runtime.createIterResultObject(_undefined, true)
  778. }
  779. if g.delegated != nil {
  780. res, done := g.tryCallDelegated(func() (Value, bool) {
  781. return g.callDelegated(g.delegated.next, v)
  782. })
  783. if !done {
  784. return res
  785. } else {
  786. v = res
  787. }
  788. }
  789. if g.state != genStateSuspendedYieldRes {
  790. v = nil
  791. }
  792. g.state = genStateExecuting
  793. return g.step(g.gen.next(v))
  794. }
  795. func (g *generatorObject) throw(v Value) Value {
  796. g.validate()
  797. if g.state == genStateSuspendedStart {
  798. g.state = genStateCompleted
  799. }
  800. if g.state == genStateCompleted {
  801. panic(v)
  802. }
  803. if d := g.delegated; d != nil {
  804. res, done := g.tryCallDelegated(func() (Value, bool) {
  805. method := toMethod(g.delegated.iterator.self.getStr("throw", nil))
  806. if method != nil {
  807. return g.callDelegated(method, v)
  808. }
  809. g.delegated = nil
  810. d.returnIter()
  811. panic(g.val.runtime.NewTypeError("The iterator does not provide a 'throw' method"))
  812. })
  813. if !done {
  814. return res
  815. }
  816. if g.state != genStateSuspendedYieldRes {
  817. res = nil
  818. }
  819. g.state = genStateExecuting
  820. return g.step(g.gen.next(res))
  821. }
  822. g.state = genStateExecuting
  823. return g.step(g.gen.nextThrow(v))
  824. }
  825. func (g *generatorObject) _return(v Value) Value {
  826. g.validate()
  827. if g.state == genStateSuspendedStart {
  828. g.state = genStateCompleted
  829. }
  830. if g.state == genStateCompleted {
  831. return g.val.runtime.createIterResultObject(v, true)
  832. }
  833. if d := g.delegated; d != nil {
  834. res, done := g.tryCallDelegated(func() (Value, bool) {
  835. method := toMethod(g.delegated.iterator.self.getStr("return", nil))
  836. if method != nil {
  837. return g.callDelegated(method, v)
  838. }
  839. g.delegated = nil
  840. return v, true
  841. })
  842. if !done {
  843. return res
  844. } else {
  845. v = res
  846. }
  847. }
  848. g.state = genStateExecuting
  849. g.gen.enterNext()
  850. vm := g.gen.vm
  851. var ex *Exception
  852. for len(vm.tryStack) > 0 {
  853. tf := &vm.tryStack[len(vm.tryStack)-1]
  854. if int(tf.callStackLen) != len(vm.callStack) {
  855. break
  856. }
  857. if tf.finallyPos >= 0 {
  858. vm.sp = int(tf.sp)
  859. vm.stash = tf.stash
  860. vm.privEnv = tf.privEnv
  861. ex1 := vm.restoreStacks(tf.iterLen, tf.refLen)
  862. if ex1 != nil {
  863. ex = ex1
  864. vm.popTryFrame()
  865. continue
  866. }
  867. vm.pc = int(tf.finallyPos)
  868. tf.catchPos = tryPanicMarker
  869. tf.finallyPos = -1
  870. tf.finallyRet = -2 // -1 would cause it to continue after leaveFinally
  871. for {
  872. ex1 := vm.runTryInner()
  873. if ex1 != nil {
  874. ex = ex1
  875. vm.popTryFrame()
  876. break
  877. }
  878. if vm.halted() {
  879. break
  880. }
  881. }
  882. } else {
  883. vm.popTryFrame()
  884. }
  885. }
  886. g.state = genStateCompleted
  887. vm.popTryFrame()
  888. if ex == nil {
  889. ex = vm.restoreStacks(g.gen.iterStackLen, g.gen.refStackLen)
  890. }
  891. if ex != nil {
  892. panic(ex)
  893. }
  894. vm.callStack = vm.callStack[:len(vm.callStack)-1]
  895. vm.sp = vm.sb - 1
  896. vm.popCtx()
  897. return g.val.runtime.createIterResultObject(v, true)
  898. }
  899. func (f *baseJsFuncObject) generatorCall(vmCall func(*vm, int), nArgs int) Value {
  900. o := &Object{runtime: f.val.runtime}
  901. genObj := &generatorObject{
  902. baseObject: baseObject{
  903. class: classObject,
  904. val: o,
  905. extensible: true,
  906. },
  907. }
  908. o.self = genObj
  909. genObj.init(vmCall, nArgs)
  910. genObj.prototype = o.runtime.getPrototypeFromCtor(f.val, nil, o.runtime.getGeneratorPrototype())
  911. return o
  912. }
  913. func (f *baseJsFuncObject) generatorVmCall(vmCall func(*vm, int), nArgs int) {
  914. vm := f.val.runtime.vm
  915. vm.push(f.generatorCall(vmCall, nArgs))
  916. vm.pc++
  917. }
  918. func (f *generatorFuncObject) vmCall(_ *vm, nArgs int) {
  919. f.generatorVmCall(f.baseJsFuncObject.vmCall, nArgs)
  920. }
  921. func (f *generatorFuncObject) Call(call FunctionCall) Value {
  922. f.prepareForVmCall(call)
  923. return f.generatorCall(f.baseJsFuncObject.vmCall, len(call.Arguments))
  924. }
  925. func (f *generatorFuncObject) assertCallable() (func(FunctionCall) Value, bool) {
  926. return f.Call, true
  927. }
  928. func (f *generatorFuncObject) export(*objectExportCtx) interface{} {
  929. return f.Call
  930. }
  931. func (f *generatorFuncObject) assertConstructor() func(args []Value, newTarget *Object) *Object {
  932. return nil
  933. }
  934. func (f *generatorMethodFuncObject) vmCall(_ *vm, nArgs int) {
  935. f.generatorVmCall(f.methodFuncObject.vmCall, nArgs)
  936. }
  937. func (f *generatorMethodFuncObject) Call(call FunctionCall) Value {
  938. f.prepareForVmCall(call)
  939. return f.generatorCall(f.methodFuncObject.vmCall, len(call.Arguments))
  940. }
  941. func (f *generatorMethodFuncObject) assertCallable() (func(FunctionCall) Value, bool) {
  942. return f.Call, true
  943. }
  944. func (f *generatorMethodFuncObject) export(*objectExportCtx) interface{} {
  945. return f.Call
  946. }