/src/erlv8_object.erl

http://github.com/beamjs/erlv8 · Erlang · 120 lines · 90 code · 30 blank · 0 comment · 0 complexity · 1f549bd9432abfc96c0e6f3b30a99f99 MD5 · raw file

  1. -module(erlv8_object).
  2. -include("erlv8.hrl").
  3. -export([vm/1,
  4. proplist/1, set_value/3, set_value/4, set_hidden_value/3, get_value/2, get_value/3, get_hidden_value/2, get_hidden_value/3,
  5. internal_field_count/1, get_internal_field/2, set_internal_field/3,
  6. set_prototype/2, get_prototype/1, delete/2, set_accessor/3, set_accessor/4, set_accessor/5, set_accessor/6,
  7. equals/2, strict_equals/2, call/2, call/3,
  8. new/1, new/2]).
  9. vm({Erlv8Obj, _Resource, VM}) when ?is_v8(Erlv8Obj) ->
  10. VM.
  11. proplist({_Erlv8Obj, Resource, VM}) ->
  12. erlv8_vm:enqueue_tick(VM,{proplist, Resource}).
  13. set_value(Key, Value, {_Erlv8Obj, Resource, VM}) ->
  14. erlv8_vm:enqueue_tick(VM, {set, Resource, Key, Value}).
  15. set_value(Key,Value,PropertyAttribute, {_Erlv8Obj, Resource, VM}) ->
  16. erlv8_vm:enqueue_tick(VM, {set, Resource, Key, Value, PropertyAttribute}).
  17. set_hidden_value(Key,Value, {_Erlv8Obj, Resource, VM}) ->
  18. erlv8_vm:enqueue_tick(VM, {set_hidden, Resource, Key, Value}).
  19. get_value(Key, {_Erlv8Obj, _Resource, _VM} = Self) ->
  20. get_value(Key, undefined, Self).
  21. get_value(Key, Default, {_Erlv8Obj, Resource, VM}) ->
  22. case erlv8_vm:enqueue_tick(VM, {get, Resource, Key}) of
  23. undefined ->
  24. Default;
  25. Val ->
  26. Val
  27. end.
  28. get_hidden_value(Key, {_Erlv8Obj, _Resource, _VM} = Self) ->
  29. get_hidden_value(Key, undefined, Self).
  30. get_hidden_value(Key, Default, {_Erlv8Obj, Resource, VM}) ->
  31. case erlv8_vm:enqueue_tick(VM, {get_hidden, Resource, Key}) of
  32. undefined ->
  33. Default;
  34. Val ->
  35. Val
  36. end.
  37. internal_field_count({_Erlv8Obj, Resource, VM}) ->
  38. erlv8_vm:enqueue_tick(VM, {internal_count, Resource}).
  39. get_internal_field(Index, {_Erlv8Obj, Resource, VM}) ->
  40. erlv8_vm:enqueue_tick(VM, {get_internal, Resource, Index}).
  41. set_internal_field(Index, {extern, Value}, {_Erlv8Obj, Resource, VM}) ->
  42. erlv8_vm:enqueue_tick(VM, {set_internal_extern, Resource, Index, Value, erlv8_extern:type(Value)});
  43. set_internal_field(Index, Value, {_Erlv8Obj, Resource, VM}) ->
  44. erlv8_vm:enqueue_tick(VM, {set_internal, Resource, Index, Value}).
  45. set_prototype(Proto, {_Erlv8Obj, Resource, VM}) ->
  46. erlv8_vm:enqueue_tick(VM, {set_proto, Resource, Proto}).
  47. get_prototype({_Erlv8Obj, Resource, VM}) ->
  48. erlv8_vm:enqueue_tick(VM, {get_proto, Resource}).
  49. delete(Key, {_Erlv8Obj, Resource, VM}) ->
  50. erlv8_vm:enqueue_tick(VM, {delete, Resource, Key}).
  51. set_accessor(Property, Getter, {_Erlv8Obj, Resource, VM}) ->
  52. case erlv8_vm:enqueue_tick(VM, {set_accessor, Resource, Property, Getter}) of
  53. badarg ->
  54. throw(badarg);
  55. Result ->
  56. Result
  57. end.
  58. set_accessor(Property, Getter, Setter, {_Erlv8Obj, Resource, VM}) ->
  59. case erlv8_vm:enqueue_tick(VM, {set_accessor, Resource, Property, Getter, Setter}) of
  60. badarg ->
  61. throw(badarg);
  62. Result ->
  63. Result
  64. end.
  65. set_accessor(Property, Getter, Setter, AccessControl, {_Erlv8Obj, Resource, VM}) ->
  66. case erlv8_vm:enqueue_tick(VM, {set_accessor, Resource, Property, Getter, Setter, AccessControl}) of
  67. badarg ->
  68. throw(badarg);
  69. Result ->
  70. Result
  71. end.
  72. set_accessor(Property, Getter, Setter, AccessControl, PropertyAttribute, {_Erlv8Obj, Resource, VM}) ->
  73. case erlv8_vm:enqueue_tick(VM, {set_accessor, Resource, Property, Getter, Setter, AccessControl, PropertyAttribute}) of
  74. badarg ->
  75. throw(badarg);
  76. Result ->
  77. Result
  78. end.
  79. equals({_Tag,AnotherObject,_}, {_Erlv8Obj, Resource, VM}) ->
  80. erlv8_value:equals(VM, Resource, AnotherObject).
  81. strict_equals({_Tag,AnotherObject,_}, {_Erlv8Obj, Resource, VM}) ->
  82. erlv8_value:strict_equals(VM, Resource, AnotherObject).
  83. call(Fun, Self) ->
  84. call(Fun,[], Self).
  85. call(Fun,Args, {_Erlv8Obj, Resource, VM}) ->
  86. Fun:call({erlv8_object, Resource,VM}, Args).
  87. new(O) ->
  88. new(O,undefined).
  89. new(O, V) ->
  90. #erlv8_object{resource = O, vm = V}.